バックボーンには、現在のイベントアグリゲーターを使用するアプリがあり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は常に配置されています。
コード例は、コレクションから削除された場合でも、家には住んでいないが、泥棒が家に入ったときに非表示コマンドを実行することを示しています。