【问题标题】:Backbone.js - Destroying a Marionette ControllerBackbone.js - 销毁木偶控制器
【发布时间】:2014-12-24 07:21:25
【问题描述】:

我在销毁 Marionette 控制器时遇到问题。我仍在思考 Marionette,更具体地说是 Backbone 垃圾收集......

这个控制器实例化了几个视图,每个视图可能有几个绑定的事件监听器。代码如下所示:

myController.js
---------------
Marionette = require('backbone.marionette');
MyView     = require('path/to/myView');

var MyController = Marionette.Controller.extend({
    initialize: function(options) {
        console.log('init');
    }
    onDestroy: function() {
        console.log('should be destroyed');
    }
    showData: function() {
        console.log('create view');
        myView = new MyView();
    }
});



appController.js
----------------
MyController = require('path/to/myController');

var controller = new MyController()
controller.showData();
controller.destroy();


output:
//init
//create view
//should be destroyed

控制器仍然存在,即使 onDestroy 确实触发了..

这可能是视图仍然具有绑定事件侦听器的问题吗?如果代码看起来很奇怪,我深表歉意……从咖啡脚本翻译过来。

【问题讨论】:

    标签: javascript backbone.js marionette


    【解决方案1】:

    为了调用销毁方法,木偶控制器在其原型上定义了一个“关闭”方法:

    controller.close(); 
    

    调用的方法是onClose

    有关信息,您可以在控制台中查看:

    【讨论】:

    • 感谢您的帮助!我把它改成了controller.close(),它确实关闭了它,但是在做堆快照时它仍然在内存中..
    • 控制器中是否有一些挥之不去的事件监听器?如果使用“on”,则在 onClose 方法中调用“off”。使用listenTo时,可以使用stopListening。除此之外,应该清理对象。何时进行清理是垃圾收集器的决定,但通常您也可以执行手动清理。 (在 Chrome 中是回收站图标)。
    • 好吧,控制器本身没有任何事件侦听器,但是该控制器创建的许多视图中的一些使用 this.listenTo... 我在销毁其中一个视图时遇到了问题,我认为这可能是这里真正的问题。我应该在这个控制器正在创建的所有视图上明确地说 onClose -> this.stopListening() 吗?
    • 在 Marionette 中,您通常使用区域来显示和关闭视图(通过布局或动态),afaik 将自动调用 stopListening。我倾向于做的是在控制器的initialize方法中实例化区域,并在控制器的onClose方法中调用this.region.close()
    • 我们也在使用区域。在这种情况下,这个控制器设置了 3 个视图,每个视图都有自己的区域。因此,所有三个区域都被传递到控制器中,然后控制器为它需要创建的三个视图中的每一个(以及其他逻辑)都有一个方法,这些视图可以通过它们各自的区域。所有这些都在初始化期间。
    猜你喜欢
    • 2015-02-16
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多