加速器合金传递参数
Posted
技术标签:
【中文标题】加速器合金传递参数【英文标题】:appcelerator alloy pass arguments 【发布时间】:2013-06-16 20:17:06 【问题描述】:我试图弄清楚如何在合金视图之间传递参数。我将有一个有多个表格的导航组,所以它可能有 3 到 5 层深。
我可以将参数从控制器传递到视图,但我想在单击时将信息(类别 ID)从视图传递到下一个表。
我不确定如何在合金中执行此操作,尝试访问变量时总是会出现未定义的错误。以下是我目前的设置。
在我看来,我有:index.xml、master.xml、row.xml、detail.xml、subDetail.xml
Index.xml
<Alloy>
<Window id="index">
<NavigationGroup id="navgroup">
<Require src="master" id="master"/>
</NavigationGroup>
</Window>
</Alloy>
这是我的 index.js
Alloy.Globals.navgroup = $.navgroup;
$.master.on('detail', function(e)
// get the detail controller and window references
var controller = Alloy.createController('detail');
var win = controller.getView();
// open the detail windows
$.navgroup.open(win);
/*
if (OS_ios && Alloy.isHandheld)
Alloy.Globals.navgroup.open(win);
else if (OS_android)
win.open();
*/
);
$.index.open();
master.xml
<Alloy>
<Window title="Categories">
<TableView id="table" onClick="openDetail">
</TableView>
</Window>
</Alloy>
master.js
function openDetail(e)
$.trigger('detail', e);
var data = [];
var sendit = Ti.Network.createHTTPClient(
onerror: function(e)
Ti.API.debug(e.error);
alert('There was an error during the connection');
,
timeout:1000,
);
//Here you have to change it for your local ip
sendit.open('GET', 'http://url.com/json.php?showCats=1');
sendit.send();
//Function to be called upon a successful response
sendit.onload = function()
var json = JSON.parse(this.responseText);
//var json = json.todo;
//if the database is empty show an alert
if(json.length == 0)
$.table.headerTitle = "The database row is empty";
//Emptying the data to refresh the view
//Insert the JSON data to the table view
for ( var i=0; i<json.length; i++)
data.push(Alloy.createController('row',
name: json[i].CatName,
catID: json[i].CatID
).getView());
//data.push(row);
Ti.API.info(json[i].CatName);
Ti.API.info(json[i].CatID);
$.table.setData(data);
;
row.xml
<Alloy>
<TableViewRow>
<Label id="name"/>
<Label id="catID"/>
</TableViewRow>
</Alloy>
row.js
var args = arguments[0] || ;
$.row.fighterName = $.name.text = args.name;
$.catID.text = args.catID;
detail.xml
<Alloy>
<Window title="Sub Categories">
<TableView id="subtable" onClick="openSubDetail">
</TableView>
</Window>
</Alloy>
detail.js
function openSubDetail(e)
$.trigger('subDetail', e);
var data = [];
var sendit = Ti.Network.createHTTPClient(
onerror: function(e)
Ti.API.debug(e.error);
alert('There was an error during the connection');
,
timeout:1000,
);
//Here you have to change it for your local ip
Ti.API.info('Cat id');
Ti.API.info(catID);
Ti.API.info('data Value:'+ $.detail.catID );
sendit.open('GET', 'http://url.com/mobile/includes/json.php?catID=12');
sendit.send();
//Function to be called upon a successful response
sendit.onload = function()
var json = JSON.parse(this.responseText);
//var json = json.todo;
//if the database is empty show an alert
if(json.length == 0)
$.table.headerTitle = "The database row is empty";
//Emptying the data to refresh the view
//Insert the JSON data to the table view
for ( var i=0; i<json.length; i++)
data.push(Alloy.createController('subDetail',
name: json[i].SubcatName,
catID: json[i].CatID
).getView());
//data.push(row);
Ti.API.info('Second Level');
Ti.API.info(json[i].SubcatName);
$.subtable.setData(data);
;
【问题讨论】:
我没有看到您要传递数据的存根代码?我假设您要跟踪一行上的点击事件,然后打开一个新窗口传递信息? 很抱歉,我不知道从哪里通过它。我想从行传递到细节,但我不知道如何传递它。我尝试了参数 0,但它似乎不起作用。我也试着看逃犯,但没有看到它是如何通过的。任何想法表示赞赏。 【参考方案1】:在行点击事件上创建一个新控制器并将对象作为参数传递给控制器。这样当在控制器中打开窗口时,控制器就有数据了。
这与创建subDetail
行时所做的相同
【讨论】:
感谢您的回复。我试过当我这样做时,我得到“subDetail”为未定义。我仍然收到错误消息,但我知道您建议的方式是正确的。我尝试将所有 details.js 移动到 row.js 中。这是您的想法还是有更好的方法来做到这一点? 你需要将你的代码发布在一个要点中,这样别人就可以看看你的问题是什么 我在这里创建了一个要点。我拿了 detail.js 代码并放入了 row.js 但我可以设置 $.subtable.setData,它是未定义的....有什么想法吗? $.subtable 怎么可能存在? gist.github.com/digitalbart/6bcce1e49d4eaef9d021以上是关于加速器合金传递参数的主要内容,如果未能解决你的问题,请参考以下文章