2012-09-08 50 views
6

我動態地創建我的應用程序控制器是這樣的:如何刪除控制器ExtJS?

var loadedController = me.app.getController(controller_name); 
      loadedController.init(); 

我如何使用後刪除此控制器? 謝謝。

回答

12

ExtJs目前不支持從控制箱中刪除控制器。要清除控制器,請執行下列操作:

  • 擴展Ext.app.EventBus與方法uncontrol即註銷所有的事件監聽器,這個控制器上註冊EventBus。查看Ext.app.EventBus#control的來源以推導出實現。或使用this one
  • 用方法removeController擴展Ext.app.Application,該方法從controllers集合中刪除給定的控制器實例。這是一個Ext.util.MixedCollection,請查看Ext.app.Application#getController的源代碼。然後使用uncontrol清理該控制器的所有註冊偵聽器。
  • 在您的特定控制器上執行destroy方法和/或擴展Ext.app.Controller。如果適合您的應用程序架構和控制器生命週期,您至少應該致電clearManagedListeners(),並可能銷燬由此控制器創建的其他對象,如視圖或商店。
+0

很好的答案,你深入挖掘主題:) –

+0

好的答案!這應該放在功能要求sencha – sra

+0

好的答案,你涵蓋了一切必須刪除:)如何測試如果控制器真的被刪除? – bhovhannes

0

您可以使用obj.destroy()銷燬任何Ext類。 請記住還要刪除對象的所有引用,以便它可以被垃圾收集。

0

getController()方法創建新的控制器對象和存儲參考它在controllers陣列。

也就是說,如果控制器使用getController()加載,它將不會被刪除,因爲它總會有至少一個引用存儲在Application對象的controllers屬性中。

要加載控制器,只要它失去對現有對象(DOM元素,Ext組件,視圖等)的引用,就會被銷燬(佔用內存),而應該使用Ext.creategetController()
下面是代碼:

var loadedController = Ext.create(
    me.app.getModuleClassName(controller_name, 'controller'), 
    { 
     application: me.app, 
     id: Ext.id(null, 'controller') 
    } 
); 
loadedController.init(me.app); 
loadedController.onLaunch(me.app); 

loadedController將是局部變量,將範圍脫身。唯一會繼續將新創建的控制器綁定到「現實生活」的東西將是控制器自己創建的元素。
例如,控制器可以在他的onLaunch()方法中創建一個新視圖,該視圖將被注入到DOM中,並且控制器將使用其init()方法中的處理程序綁定來偵聽查看事件。只要視圖存在,控制器也會存在。但是當用戶關閉視圖時,視圖將被銷燬,因爲它是我們控制器的最後一個參考,控制器也將被銷燬。與控制器創建

UPDATE
監聽器被附加到Ext.app.EventBus並可以防止自動清除控制部,因爲它們也可以保持到該控制器的引用。