查看是不是从其他控制器Appcelerator的合金更新(View is not updating

2019-10-23 11:12发布

我希望你将被罚款。 我有在Appcelerator的钛铝合金麻烦更新视图,

基本上,我希望能够删除选择器之前的孩子,然后添加在选择器新的一个是在不同的控制器/认为我目前在我.....

我跟了这此解决方案不幸的是不是为我工作。 下面是我想要的代码。

createEvent.js

Ti.App.addEventListener('db_update', function(){
   alert("OK");
   $.picker.removeAllChildren();
})

customParty.js

$.btnclick.addEventListener('click', function(){
    Ti.App.fireEvent('db_update');
});
 // OK alert shows up but the children of picker aren't removed. 

Answer 1:

由于显示好警报,你在好的方法和回调函数调用成功。 这里的问题是,调用removeAllChildren方法并没有从您选择器删除行。 解决的办法是遍历colums和删除这种行:

Ti.App.addEventListener('db_update', function(){
   alert("OK");
   //get picker columns
   var columns=$.picker.getColumns();
   //Iterate over picker columns
   for (var it=0,length=columns.length;i<length;it++){
        //iterate over column rows
        if(columns[it]){
             var len = col.rowCount;
             for(var index=0,collength=columns[it].length;index<collength;index++){
                //remove rows[index] of columns[it]
                columns[it].removeRow(columns[it].rows[index]);
             }
        }
   }
});

顺便说Applcelerator的乡亲们说,使用全局事件(Ti.App事件)可能会导致内存管理人员的问题...

请记住,应用级事件是全球性的,这意味着它们将保留在上下文中的应用程序正在运行的(除非您删除它们)的整个时间。 这也意味着,他们引用任何对象也将保持在范围内,而你的应用程序运行。 这可以防止被垃圾收集的对象。 Appcelerator的同性恋者 。

另一种方法是使用全局函数:

在第一视图控制器(其中选择器定义):

Alloy.Globals.removeAllPickerChildren=function(){
      //do what you want here
};

然后在视图 - 控制Seconde系列:

$.btnclick.addEventListener('click', function(){
    if(Alloy.Globals.removeAllPickerChildren)
         Alloy.Globals.removeAllPickerChildren();
});


文章来源: View is not updating from other controller Appcelerator Alloy