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

83

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

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

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

Эд Тейлор
источник
Не могли бы вы привести пример того, какова ваша точка зрения на экосистему? Ваш вопрос наводит на мысль, что на странице сразу много просмотров. Я не могу представить себе, что вы пытаетесь сделать, и поэтому не могу предложить ответ, который может быть тем, что вам нужно.
Bill Eisenhauer
1
некоторые другие шаблоны из этих замечательных сообщений: lostechies.com/derickbailey/2011/09/15/… coenraets.org/blog/2012/01/…
daedelus_j

Ответы:

47

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

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

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

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

updateView: function() {
  view.remove();
  view.render();
};
Joshvermaire
источник
5
Я не думаю, что это правильно. Функция удаления представления просто удаляет этот элемент представления из DOM ( см. Здесь ). Я думаю, этот парень хочет полностью удалить объект просмотра.
Nutritioustim
2
this.remove () в конечном итоге вызывает jquery remove (), который также удаляет данные и события ... Тем не менее, я думаю, вам также нужно вызвать this.undelegateEvents, чтобы отвязаться от других событий, таких как пользовательские события или изменения в модели ..
открывается
21
this.remove()звонки this.stopListening()и this.$el.remove(). Первый удаляет все прослушиватели событий, добавленные с помощью this.listenTo(...). Второй удаляет все прослушиватели событий, добавленные с помощью jQuery. Между этими двумя вы должны быть охвачены, если вы не использовали какие-либо другие средства добавления прослушивателей событий. Так что это правильный ответ, и я получил +1.
chowey 08
162

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

}

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

sdailey
источник
10
для того, что я видел, this.remove () должен вызывать jQuery remove, который должен удалить элемент из DOM, но также удалить данные и события, связанные с ним. Так что я думаю, что вызов undelegateEvents и removeData не нужен ... Я прав?
открывается
1
@opensas События сохранялись после this.remove (), несмотря на удаление элемента из DOM. this.undelegateEvents () был необходим для отмены привязки всех событий. Как я уже сказал, это было похоже на излишество, но это помогло.
sdailey
3
Мне это нравится. Хотя вы должны использовать this.$elвместо $(this.el);)
mreq
3
+1 за хороший ответ на мою проблему, +1 за написание первого ответа :)
1nfiniti
1
Моя точка зрения не меняется при его разрушении и повторном создании. Это из-за this.remove()?
Raeesaa
20

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

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

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

Бассам Механни
источник
8

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

destroy: function(){
  this.remove();
  this.unbind();
}
JT703
источник
4

Согласно текущей документации Backbone ....

view.remove ()

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

Dre
источник
0

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

destroyView : function () {
    this.$el.remove();
}
Чхорн Понлеу
источник
Придется убить слушателей тоже с помощью, this.stopListening()а потом и return thisдля хорошей меры
Брэндон,
0

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

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]);
}
Деот
источник
Первый подход сработал для меня, я столкнулся с аналогичной проблемой с ореолом представлений, и события запускались несколько раз, когда каждое представление воссоздавалось, когда вы отправляли форму
ONYX