2015-06-20 46 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(); 
});