Javascript 关于事件以及如何正确解除绑定的问题
大家好 我正在使用Marionette.js编写一个应用程序,最近我开始注意到,从一个视图移动到另一个视图,启动/停止不同的模块,内存消耗会增加,而不会被释放。我开始怀疑我是否正确地解除了事件绑定,是否也正确地绑定了它们 因此,我有以下情况Javascript 关于事件以及如何正确解除绑定的问题,javascript,backbone.js,marionette,single-page-application,Javascript,Backbone.js,Marionette,Single Page Application,大家好 我正在使用Marionette.js编写一个应用程序,最近我开始注意到,从一个视图移动到另一个视图,启动/停止不同的模块,内存消耗会增加,而不会被释放。我开始怀疑我是否正确地解除了事件绑定,是否也正确地绑定了它们 因此,我有以下情况 模块 我的应用程序由子应用程序(模块)组成。当我定义一个模块时,我会绑定到全局事件聚合器。大概是这样的: MyApplication.module(...) { var api = { ... some functions here ... }
MyApplication.module(...) {
var api = { ... some functions here ... }
// Binding to events
MyApplication.vent.on('some:event', function() {...});
MyApplication.vent.on('some:other:event', function() {...});
}
我查看了文档,了解到“on”不是一个很好的选择,我可能应该使用“listenTo”:
但是,问题是,当模块停止时,它会调用“stopListening”还是其他一些内部方法来解除绑定我在其中绑定的所有事件?我检查了木偶模块的源代码和文档,但是,如果我理解正确,当调用stop时,我需要自己负责解除绑定。我说得对吗
MyApplication.module(...) {
var controller = Marionette.Controller.extend({
...
// This will be unbinded as I understand?
this.listenTo(someObject, 'some:event', _.bind(function() {
// This will also be unbinded
this.listenTo(someOtherObject, 'some:event', function() {
// This won't be, because in this case this is not in a "controller"
// context but in a function's context which wasn't bound to "controler"
// context.
this.listenTo(some3rdObject, 'some:event', function() { ... });
});
}, this));
});
// Create controller when this sub-application gets initialized.
Contents.addInitializer(function () {
MyModule.Controller = new controller();
});
// Destroy controller and unbind all its event handlers.
Contents.addFinalizer(function () {
MyModule.Controller.close();
delete Contents.Controller;
});
}
所以,对于控制器,只要我使用“listenTo”,我就不需要做任何事情,对吗
this.listenTo(..., 'some:event', function() {...});
我应该没事,对吗
总而言之。。。我只需要在模块的停止事件中解除绑定,在所有其他情况下,它由木偶的核心负责,只要我不使用直接的“on”,而是使用“this.listenTo”
非常感谢大家的回答。控制器和视图的清洁工作正常,但模块无法完成 以下是更详细的信息:
listenTo
绑定的事件的绑定。你可以进去看看主干。查看删除方法执行停止侦听。此外,木偶。视图的关闭
调用主干的移除
。这是
木偶.模块
,但是停止
方法中没有停止监听
。因此,marionete.Module#stop
不能解除事件绑定,您应该在finalizer或onStop
,onBeforeStop
处理程序中手动执行
更新:在木偶。模块之后
调用停止监听
打开停止以解除所有事件的绑定非常感谢您对Dmytro的评论。
this.listenTo(..., 'some:event', function() {...});