Javascript 销毁或删除Backbone.js中的视图

Javascript 销毁或删除Backbone.js中的视图,javascript,javascript-events,backbone.js,Javascript,Javascript Events,Backbone.js,我目前正在尝试为视图实现销毁/删除方法,但无法为所有视图提供通用解决方案 我希望会有一个事件附加到控制器,这样当一个新请求通过时,它会破坏以前的视图,然后加载新视图 有什么方法可以做到这一点而不必为每个视图构建删除函数吗?而不必知道所有信息。。。您可以将重置触发器绑定到模型或控制器: this.bind("reset", this.updateView); 如果要重置视图,请触发重置 对于回调,请执行以下操作: updateView: function() { view.remove();

我目前正在尝试为视图实现销毁/删除方法,但无法为所有视图提供通用解决方案

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


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

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

this.bind("reset", this.updateView);
如果要重置视图,请触发重置

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

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

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

}

对我来说似乎有些过分,但其他方法并没有完全奏效。

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

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

我知道我来晚了,但希望这对其他人有用。如果您使用的是主干网v0.9.9+,则可以使用、
listenTo
stopstending

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

stopListening
remove
自动调用。你可以多读一些,我想这应该行得通

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

根据当前的主干文档

view.remove()


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

您可以使用该方法解决此问题

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();
    })
}
另一种方法:创建一个全局变量,如下所示:
\u 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]);
}
初始化:函数(){
this.routerName='home';
_global.routerList.push(this);
}
/*在内存中删除它*/

对于(var i=0;我能举一个你的视图生态系统是什么的例子吗?你的问题让我觉得页面上同时有很多视图。我不能完全想象你想做什么,因此无法提供一个可能是你需要的答案。这些伟大帖子中的一些其他模式:我认为这不对。视图的删除功能在just remove上,该视图的元素来自DOM()。我认为这家伙想要完全删除视图对象。this.remove()最终调用jquery的remove(),这也会删除数据和事件…尽管如此,我认为您还必须调用this.undelegateEvents以解除与其他事件的绑定,例如自定义事件或对模型的更改。
this.remove()
调用
this.stopListening()
this。$el.remove()
。第一个删除使用
this.listenTo(…)
添加的所有事件侦听器。第二个删除使用jQuery添加的所有事件侦听器。在这两者之间,除非您使用其他方法添加事件侦听器,否则应该涵盖您。因此,这个答案是正确的,并且从我这里得到+1。就我所见,这个.remove()应该调用jQuery的remove,它应该从DOM中删除元素,但也应该删除附加到它的数据和事件。因此,我想对undelegateEvents和removeData的调用应该是不必要的……对吗?@opensas事件一直持续到this.remove()之后,尽管元素已从DOM中删除。this.undelegateEvents()是所有事件解除绑定所必需的。正如我所说,这感觉有些过分,但它确实起到了作用。我喜欢它。尽管你应该使用
这个。$el
而不是
$(this.el)
;)+1是我问题的好答案,+1是写你的第一个答案:)我的观点不会因为再次破坏和创建它而被重新呈现。是不是因为
this.remove()
?也必须使用
this.stopListening()
杀死侦听器,然后
返回此
,以便更好地衡量第一种方法对我有效,我在视图重影方面遇到了类似的问题,并且在提交表单时重新创建每个视图时都会触发多次事件