在Backbone.js中销毁或删除视图

时间:2011-07-04 09:40:04

标签: javascript javascript-events backbone.js

我目前正在尝试为视图实现一个destroy / remove方法,但是我无法获得适用于我所有视图的通用解决方案。

我希望有一个事件要附加到控制器上,这样当一个新请求通过时它会破坏以前的视图然后加载新的视图。

有没有办法在不必为每个视图构建删除功能的情况下执行此操作?

7 个答案:

答案 0 :(得分:161)

我必须绝对确定视图不仅仅是从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);

}

对我而言似乎有些过分,但其他方法并没有完全解决问题。

答案 1 :(得分:47)

不知道所有信息......您可以将重置触发器绑定到模型或控制器:

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

当您想重置视图时,触发重置。

对于你的回调,请执行以下操作:

updateView: function() {
  view.remove();
  view.render();
};

答案 2 :(得分:20)

我知道我迟到了,但希望这对其他人有用。如果您使用的是主干v0.9.9 +,则可以使用listenTostopListening

initialize: function () {
    this.listenTo(this.model, 'change', this.render);
    this.listenTo(this.model, 'destroy', this.remove);
}
stopListening会自动调用

remove。您可以阅读更多herehere

答案 3 :(得分:8)

这就是我一直在使用的。没有看到任何问题。

destroy: function(){
  this.remove();
  this.unbind();
}

答案 4 :(得分:4)

根据目前的Backbone文档......

view.remove()

从DOM中删除视图及其el,并调用stopListening以删除视图已侦听的任何绑定事件。

答案 5 :(得分:0)

我认为这应该有用

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

答案 6 :(得分: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]);
}