我有一个奇怪的问题,我的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()永远不会发生......我错过了什么?
答案 0 :(得分:1)
是的区域确实有一个紧密的方法:
关闭视图应该像关闭区域一样简单,我通常从控制器执行此操作。
我不知道这对您是否有帮助,但我这样做的方法是按如下方式设置控制器:
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”或者事件听众会成倍增加。