2015-06-20 51 views
1

我希望你会好起来的。 我在更新Titanium Appcelerator Alloy中的视图时遇到问题,查看并非从其他控制器更新Appcelerator合金

我基本上希望能够从picker中删除以前的孩子,然后在选择器中添加新的控制器/视图中的新控件。 ..

我跟着这THIS SOLUTION不幸的是,这不适合我。这是我正在尝试的代码。

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. 

回答

0

由于好吧警报显示,你在好的方法和回调函数调用成功。 这里的问题是调用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 gays

另一种方法是使用全局功能:

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

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

然后在Seconde系列的ViewController:

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