Backbone.js :как отвязаться от событий, при удалении модели

в магистрали у нас есть приложение, которое использует агрегатор событий, расположенный на window.App.Eventsтеперь во многих представлениях мы привязываемся к этому агрегатору, и я вручную написал функцию уничтожения для представления, которая обрабатывает отвязку от этого агрегатора событий, а затем удаляет представление. (вместо прямого удаления вида ).

В некоторых моделях нам также требовалась эта функция, но я не могу понять, как с ней справиться.

некоторые модели должны быть привязаны к определенным событиям, но, возможно, я ошибаюсь, но если мы удаляем модель из коллекции, она остается в памяти из-за этих привязок к агрегатору событий, которые все еще существуют.

На самом деле в модели нет функции удаления, как в представлении. так как бы я tack это?

РЕДАКТИРОВАТЬ по запросу, пример кода.

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 всегда на месте для простоты передачи событий через все приложение.

пример кода показывает, что даже когда они удалены из коллекции, они больше не живут в доме, но все равно выполняют команду скрытия, когда грабитель входит в дом.

7
задан Sander 3 May 2012 в 11:42
поделиться