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

Ad *_*lor 82 javascript javascript-events backbone.js

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

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

有没有办法做到这一点,而无需为每个视图构建一个删除功能?

sda*_*ley 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);

}
Run Code Online (Sandbox Code Playgroud)

对我来说似乎有些过分,但其他方法并没有完全解决问题.

  • 对于我所看到的,this.remove()应该调用jQuery的remove,它应该从DOM中删除元素,但也删除附加到它的数据和事件.所以我想不应该调用undelegateEvents和removeData ......我是对的吗? (10认同)
  • 我喜欢.虽然你应该使用`this.$ el`而不是`$(this.el)`;) (3认同)
  • +1为我的问题一个很好的答案,+1写你的第一个答案:) (3认同)

jos*_*ire 47

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

this.bind("reset", this.updateView);
Run Code Online (Sandbox Code Playgroud)

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

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

updateView: function() {
  view.remove();
  view.render();
};
Run Code Online (Sandbox Code Playgroud)

  • `this.remove()`调用`this.stopListening()`和`this.$ el.remove()`.第一个删除使用`this.listenTo(...)`添加的所有事件侦听器.第二个删除使用jQuery添加的所有事件侦听器.在这两者之间,除非您使用其他方法添加事件侦听器,否则应该覆盖它们.所以这个答案是正确的,并从我得到+1. (21认同)
  • 我不认为这是对的.View的remove函数只是从DOM中删除了该视图的元素([见这里](http://documentcloud.github.com/backbone/#View-remove)).我想这家伙想完全删除视图对象. (5认同)
  • this.remove()最终调用jquery的remove(),它也删除了数据和事件......不过我认为你还必须调用this.undelegateEvents来取消绑定其他事件,比如自定义事件或对模型的更改. (2认同)

Bas*_*nni 20

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

initialize: function () {
    this.listenTo(this.model, 'change', this.render);
    this.listenTo(this.model, 'destroy', this.remove);
}
Run Code Online (Sandbox Code Playgroud)

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


JT7*_*703 8

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

destroy: function(){
  this.remove();
  this.unbind();
}
Run Code Online (Sandbox Code Playgroud)