Уничтожить или удалить вид в 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]);
}