加速器合金传递参数

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();

ma​​ster.xml

<Alloy>

    <Window title="Categories">
        <TableView id="table" onClick="openDetail">


        </TableView>
    </Window>


</Alloy>

ma​​ster.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

以上是关于加速器合金传递参数的主要内容,如果未能解决你的问题,请参考以下文章

面试题1,值传递和参数传递

通过url传递参数+解决传递中文参数出现乱码问题

java传递参数问题

vb过程的参数传递方式都有哪些?

C++中函数参数的传递方式有哪几种

Python按值传递参数和按引用传递参数