Backbone.js - Marionette ItemView onDestroy()从未调用过

时间:2014-12-28 00:56:23

标签: javascript backbone.js marionette

我有一个奇怪的问题,我的ItemView的onDestroy()方法似乎永远不会运行。 我正在使用Marionette v 2.2.1。这是我所拥有的非常简化的版本。

myItemView.js
-------------

initialize: function() {
  console.log('ItemView init');
  var self = this;
  this.listenTo(eventsModel, 'change', function(){
    console.log('changed, lets do something');
    self.doSomething();
  });
  this.listenTo(eventsModel, 'destroy', function(){
    console.log('lets destroy ourselves');
    self.destroy();
  });
}

onDestroy: function() {
  console.log('hurray, destroyed!');
  this.stopListening();
}

doSomething: function() {
  console.log('doing something');
}


myController.js
---------------
var myView = new myItemView({model: aModel})
eventsModel.trigger('change');
eventsModel.trigger('destroy');

output:
//ItemView init
//changed, lets do something
//doing something
//lets destroy ourselves

正如你所看到的,onDestroy()永远不会发生......我错过了什么?

1 个答案:

答案 0 :(得分:1)

是的区域确实有一个紧密的方法:

enter image description here

关闭视图应该像关闭区域一样简单,我通常从控制器执行此操作。

我不知道这对您是否有帮助,但我这样做的方法是按如下方式设置控制器:

var Ctr_Test = Marionette.Controller.extend({ 

    initialize: function(options){ 
        this.region = new Marionette.Region({ el: "#some-region"}); 
        this.events(); 
    }, 

    events: function(){ 
        //Trigger any event you'd like from the view to call close(); 
        Zwoop.on("app:reset", _.bind(function(){
            this.close(); 
        }, this)); 
    }, 

    showTest: function(){ 
        this._showTest(); 
    }, 

    _showTest: function(){ 
        //Render some views in the region 
        var itemview = new Itemview(); 
        this.region.show(itemview); 

    }, 

    //Unbind all events 
    onClose: function(){ 
        Zwoop.off("app:reset"); 
        this.region.close(); 
    }

}); 

一个注意点是始终清除在控制器中绑定的所有事件,否则会导致内存泄漏。如果你在视图中使用listenTo,我不认为你必须处理手动清理,但是当你使用on时(比如我的例子),那么你需要调用“off”或者事件听众会成倍增加。