Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 关于事件以及如何正确解除绑定的问题_Javascript_Backbone.js_Marionette_Single Page Application - Fatal编程技术网

Javascript 关于事件以及如何正确解除绑定的问题

Javascript 关于事件以及如何正确解除绑定的问题,javascript,backbone.js,marionette,single-page-application,Javascript,Backbone.js,Marionette,Single Page Application,大家好 我正在使用Marionette.js编写一个应用程序,最近我开始注意到,从一个视图移动到另一个视图,启动/停止不同的模块,内存消耗会增加,而不会被释放。我开始怀疑我是否正确地解除了事件绑定,是否也正确地绑定了它们 因此,我有以下情况 模块 我的应用程序由子应用程序(模块)组成。当我定义一个模块时,我会绑定到全局事件聚合器。大概是这样的: MyApplication.module(...) { var api = { ... some functions here ... }

大家好

我正在使用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”:

    但是,问题是,当模块停止时,它会调用“stopListening”还是其他一些内部方法来解除绑定我在其中绑定的所有事件?我检查了木偶模块的源代码和文档,但是,如果我理解正确,当调用stop时,我需要自己负责解除绑定。我说得对吗

  • 控制器
  • 可以初始化和关闭。从文件中我看到:

    每个控制器实例都有一个内置的close方法,该方法处理解除绑定直接连接到控制器实例的所有事件,以及使用控制器的EventBinder绑定的事件

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

    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() {...});