85

我目前正在尝试为视图实现销毁/删除方法,但我无法获得适用于所有视图的通用解决方案。

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

有什么方法可以做到这一点,而不必为每个视图构建一个删除功能?

4

7 回答 7

163

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

}

对我来说似乎有点矫枉过正,但其他方法并没有完全奏效。

于 2012-07-18T03:53:37.550 回答
48

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

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

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

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

updateView: function() {
  view.remove();
  view.render();
};
于 2011-07-08T06:48:52.460 回答
20

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

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

stopListening由 自动调用remove。你可以在这里这里阅读更多

于 2013-03-11T22:51:24.963 回答
8

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

destroy: function(){
  this.remove();
  this.unbind();
}
于 2012-08-14T20:52:17.800 回答
4

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

view.remove()

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

于 2016-02-11T03:46:41.070 回答
0

我认为这应该有效

destroyView : function () {
    this.$el.remove();
}
于 2015-05-12T08:56:27.220 回答
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]);
}
于 2016-05-10T14:16:24.300 回答