6

我在我的应用程序中动态创建控制器,如下所示:

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

使用后如何删除此控制器?谢谢。

4

4 回答 4

12

ExtJs 目前不支持开箱即用的移除控制器。要清理控制器,请执行以下操作:

  • Ext.app.EventBus使用一种方法进行扩展,该方法uncontrol取消注册此控制器在 EventBus 上注册的所有事件侦听器。查看源代码Ext.app.EventBus#control以派生实现。或者使用这个
  • 使用从集合中删除给定控制器实例Ext.app.Application的方法进行扩展。这是一个 Ext.util.MixedCollection,请查看. 然后使用 . 清理该控制器的所有注册侦听器。removeControllercontrollersExt.app.Application#getControlleruncontrol
  • destroy在您的特定控制器和/或扩展上实现方法Ext.app.ControllerclearManagedListeners()如果适合您的应用程序体系结构和控制器生命周期,您至少应该调用并可能销毁此控制器创建的其他对象,例如视图或存储。
于 2012-09-10T02:37:51.300 回答
2

Sencha 论坛已发起高级会员请求。不幸的是,最初的请求自 8 月以来一直存在,没有任何消息。我刚刚参考这个线程提出了这个请求。

煎茶论坛主题(高级版)

于 2012-12-10T19:46:29.497 回答
0

您可以使用obj.destroy(). 请记住还要删除对对象的所有引用,以便对其进行垃圾收集。

于 2012-09-09T14:20:32.937 回答
0

getController()方法创建一个新的控制器对象并将对它的引用存储在controllers数组中。

这意味着,如果控制器是使用getController()加载的,它不会被删除,因为总会有至少一个对它的引用存储在controllersApplication 对象的属性中。

要以这样一种方式加载控制器,一旦它失去对现有对象(DOM 元素、Ext 组件、它的视图等)的任何引用,它就会被销毁(释放它占用的内存),应该使用Ext.create而不是getController ()
这是代码:

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并且可能会阻止自动删除控制器,因为它们还可能保留对该控制器的引用。

于 2013-01-23T18:14:33.607 回答