Уничтожить или удалить представление в Backbone.js - PullRequest
81 голосов
/ 04 июля 2011

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

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

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

Ответы [ 7 ]

161 голосов
/ 18 июля 2012

Мне нужно было быть абсолютно уверенным, что представление было не просто удалено из 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);

}

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

47 голосов
/ 08 июля 2011

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

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

и когда вы хотите сбросить представления, запустите сброс.

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

updateView: function() {
  view.remove();
  view.render();
};
20 голосов
/ 12 марта 2013

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

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

stopListening автоматически вызывается *1007*.Вы можете прочитать больше здесь и здесь

8 голосов
/ 15 августа 2012

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

destroy: function(){
  this.remove();
  this.unbind();
}
4 голосов
/ 11 февраля 2016

В соответствии с текущей документацией по магистрали ....

view.remove ()

Удаляет представление и его el из DOM и вызывает stopListening, чтобы удалить все связанные события, которые у представления есть listenTo'd.

0 голосов
/ 10 мая 2016

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

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]);
}
0 голосов
/ 12 мая 2015

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

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