在主干中,我们有一个使用事件聚合器的应用程序,位于window.App.Events
现在,在许多视图中,我们绑定到该聚合器,并且我在视图上手动编写了一个销毁函数,该函数处理与该事件聚合器的解除绑定,然后删除该视图. (而不是直接删除视图)。
现在,在某些模型中我们也需要此功能,但我不知道如何解决它。
某些模型需要绑定到某些事件,但也许我错了,但是如果我们从集合中删除一个模型,由于这些绑定到仍然存在的事件聚合器,它会保留在内存中。
模型上没有真正的删除功能,就像视图一样。那么我将如何解决这个问题?
根据要求编辑 ,一些代码示例。
App = {
Events: _.extend({}, Backbone.Events)
};
var User = Backbone.Model.extend({
initialize: function(){
_.bindAll(this, 'hide');
App.Events.bind('burglar-enters-the-building', this.hide);
},
hide: function(burglarName){
this.set({'isHidden': true});
console.warn("%s is hiding... because %s entered the house", this.get('name'), burglarName);
}
});
var Users = Backbone.Collection.extend({
model: User
});
var House = Backbone.Model.extend({
initialize: function(){
this.set({'inhabitants': new Users()});
},
evacuate: function(){
this.get('inhabitants').reset();
}
});
$(function(){
var myHouse = new House({});
myHouse.get('inhabitants').reset([{id: 1, name: 'John'}, {id: 1, name: 'Jane'}]);
console.log('currently living in the house: ', myHouse.get('inhabitants').toJSON());
App.Events.trigger('burglar-enters-the-building', 'burglar1');
myHouse.evacuate();
console.log('currently living in the house: ', myHouse.get('inhabitants').toJSON());
App.Events.trigger('burglar-enters-the-building', 'burglar2');
});
在 jsFiddle 上查看此代码(在控制台中输出):http: //jsfiddle.net/saelfaer/szvFY/1/
如您所见,我没有绑定到模型上的事件,而是绑定到事件聚合器。从模型本身解除绑定事件是不必要的,因为如果它被删除,没有人会再次触发它的事件。但是 eventAggregator 始终存在,以便于在整个应用程序中传递事件。
代码示例显示,即使将它们从集合中删除,它们也不再住在房子里,但当窃贼进入房子时仍然执行隐藏命令。