编程语言
首页 > 编程语言> > javascript-Marionette.js有关事件以及如何正确解除绑定的问题

javascript-Marionette.js有关事件以及如何正确解除绑定的问题

作者:互联网

祝大家好.

我正在使用Marionette.js编写应用程序,最近我开始注意到从视图到视图的移动以及开始/停止不同模块的内存消耗会增加并且不会被释放.我开始怀疑我是否正确取消绑定事件以及是否也正确绑定它们.

所以,我有以下几种情况

>模块

我的应用程序由子应用程序(模块)组成.当我定义一个模块时,我对全局事件聚合器做了一些绑定.像这样:

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”:

MyApplication.module(...) {
    var api = { ... some functions here ... }

    // Binding to events
    this.listenTo(MyApplication.vent, 'some:event', function() {...});
    this.listenTo(MyApplication.vent, 'some:other:event', function() {...});
}

但是,这是一个问题,当模块停止运行时,它会调用“ stopListening”还是其他一些将我绑定到其中的所有事件解除绑定的内部方法?我检查了牵线木偶模块和文档的源代码,但是,如果我理解正确,则在调用stop时,我需要自己解开所有绑定.我对吗?

>控制器

可以初始化和关闭.从文档中,我看到:

Each Controller instance has a built in close method that handles unbinding all of the events that are directly attached to the controller instance, as well as those that are bound using the EventBinder from the controller.

这是否意味着如果以下操作正确解除了绑定在控制器中的所有事件的绑定?我想答案是肯定的.

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”,我就不需要执行任何操作,对吗?

>意见

在视图中,根据documentation,当视图关闭时,所有控件都将解除绑定.再说一次,只要我用

this.listenTo(..., 'some:event', function() {...});

我应该没事吧?

总结一下……我只需要在模块的stop事件中解除绑定的约束,在其他所有情况下,只要我不使用直接的“ on”而使用“ this.listenTo”,则由木偶的核心来解决. .

提前非常感谢大家的回答.

解决方法:

控制器和视图可以正确执行其清理工作,而模块不能执行清理工作.

这里是更详细的信息:

>控制器

如果关闭控制器,它将取消绑定在控制器上下文中使用listenTo绑定的所有事件.您可以输入controller source code.
>查看

根据Backbone.View source code,remove方法不会stopListening. Marionette.View的关闭也将内幕的主干移除.这是source code.
>模块

我已经检查了Marionette.Module source code,但是stop方法中没有stopListening.因此,Marionette.Module#stop不会解除事件的绑定,您应该在终结器或onStop,onBeforeStop处理程序中手动进行操作.

更新:Marionette.js v1.7.0 Marionette.Module在停止后调用stopListening取消绑定所有事件.

标签:backbone-js,marionette,single-page-application,javascript
来源: https://codeday.me/bug/20191029/1962515.html