Знищити або видалити вигляд у Backbone.js


83

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

Я сподівався, що буде подія, яку можна приєднати до контролера, так що коли надходить новий запит, він руйнує попередні подання, а потім завантажує нові.

Чи є спосіб зробити це, не будуючи функції видалення для кожного подання?


Не могли б ви навести приклад того, що таке екосистема вашого погляду? Ваше запитання змушує мене думати, що на сторінці є багато переглядів одночасно. Я не можу повністю уявити, що ви намагаєтеся зробити, і, отже, не можу запропонувати відповідь, яка може бути вам потрібною.
Білл Айзенхауер,

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();
};

5
Я вважаю, що це не правильно. Функція видалення подання просто видаляє елемент цього подання з DOM ( див. Тут ). Думаю, цей хлопець хоче повністю видалити об’єкт подання.
Nutritioustim

2
this.remove () закінчується викликом jquery's remove (), який також видаляє дані та події ... Тим не менше, я думаю, вам також доведеться викликати this.undelegateEvents, щоб від'єднатися від інших подій, таких як власні події або зміни в моделі ..
відкривається10

21
this.remove()дзвінки this.stopListening()та this.$el.remove(). Перший видаляє всі прослуховувачі подій, додані за допомогою this.listenTo(...). Другий видаляє всі прослуховувачі подій, додані за допомогою jQuery. Між ними ви повинні бути охоплені, якщо ви не використовували інші засоби додавання слухачів подій. Отже, ця відповідь правильна і отримує від мене +1.
chowey

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);

}

Мені здавалося надмірним, але інші підходи не повністю зробили трюк.


10
для того, що я бачив, this.remove () повинен викликати jQuery's 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

Я знаю, що запізнився на вечірку, але, сподіваюся, це буде корисно комусь іншому. Якщо ви використовуєте магістраль 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();
}

4

Відповідно до поточної документації Backbone ....

view.remove ()

Видаляє представлення та його el з DOM і викликає stopListening, щоб видалити всі пов'язані події, які подання має listeTo'd.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.