我目前正在尝试为视图实现destroy / remove方法,但无法获得通用的解决方案以对所有视图起作用。
我希望会有一个事件附加到控制器,以便当有新请求通过时,它会破坏先前的视图,然后加载新的视图。
有什么方法可以做到,而不必为每个视图构建删除功能?
我目前正在尝试为视图实现destroy / remove方法,但无法获得通用的解决方案以对所有视图起作用。
我希望会有一个事件附加到控制器,以便当有新请求通过时,它会破坏先前的视图,然后加载新的视图。
有什么方法可以做到,而不必为每个视图构建删除功能?
Answers:
在不知道所有信息的情况下...您可以将重置触发器绑定到模型或控制器:
this.bind("reset", this.updateView);
当您想重置视图时,触发重置。
对于您的回调,请执行以下操作:
updateView: function() {
view.remove();
view.render();
};
this.remove()
呼叫this.stopListening()
和this.$el.remove()
。第一个将删除使用添加的所有事件侦听器this.listenTo(...)
。第二个删除所有使用jQuery添加的事件侦听器。在这两者之间,除非您使用其他添加事件侦听器的方法,否则您应该被覆盖。因此,这个答案是正确的,并向我+1。
我必须绝对确保视图不仅从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);
}
在我看来,这似乎太过分了,但是其他方法并不能完全解决问题。
this.$el
而不是$(this.el)
;)
this.remove()
吗?
您可以使用解决问题的方法!
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]);
}