Уничтожить или удалить вид в Backbone.js

В настоящее время я пытаюсь реализовать метод destroy/remove для представлений, но я не могу получить общее решение для работы во всех моих представлениях.

Я надеялся, что будет добавлено событие для контроллера, так что, когда новый запрос пройдет через него, он уничтожит предыдущие представления , а затем загрузит новые.

Есть ли способ сделать это, не создавая функцию удаления для каждого представления?

Ответ 1

Не зная всей информации... Вы можете связать триггер reset с моделью или контроллером:

this.bind("reset", this.updateView);

и когда вы хотите reset просмотреть, вызовите reset.

Для вашего обратного вызова сделайте что-то вроде:

updateView: function() {
  view.remove();
  view.render();
};

Ответ 2

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

destroy_view: function() {

    // COMPLETELY UNBIND THE VIEW
    this.undelegateEvents();

    this.$el.removeData().unbind(); 

    // Remove view from DOM
    this.remove();  
    Backbone.View.prototype.remove.call(this);

}

Казалось, что это слишком много, но другие подходы не полностью помогли.

Ответ 3

Я знаю, что опаздываю на вечеринку, но, надеюсь, это будет полезно для кого-то другого. Если вы используете магистраль v0.9.9 +, вы можете использовать listenTo и stopListening

initialize: function () {
    this.listenTo(this.model, 'change', this.render);
    this.listenTo(this.model, 'destroy', this.remove);
}

stopListening автоматически вызывается remove. Здесь вы можете прочитать здесь и здесь

Ответ 4

Это то, что я использовал. Не видели никаких проблем.

destroy: function(){
  this.remove();
  this.unbind();
}

Ответ 5

В соответствии с текущей базой документации....

view.remove()

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

Ответ 6

Я думаю, что это должно работать

destroyView : function () {
    this.$el.remove();
}

Ответ 7

Вы можете использовать способ решения проблемы!

initialize:function(){
    this.trigger('remove-compnents-cart');
    var _this = this;
    Backbone.View.prototype.on('remove-compnents-cart',function(){
        //Backbone.View.prototype.remove;
        Backbone.View.prototype.off();
        _this.undelegateEvents();
    })
}

Другой способ: создать глобальную переменную, например: _global.routerList

initialize:function(){
    this.routerName = 'home';
    _global.routerList.push(this);
}
/*remove it in memory*/
for (var i=0;i<_global.routerList.length;i++){
    Backbone.View.prototype.remove.call(_global.routerList[i]);
}