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

IT技术 javascript backbone.js backbone-events
2021-03-10 04:21:28

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

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

有没有办法做到这一点而不必为每个视图构建一个删除函数?

6个回答

我必须绝对确定该视图不仅从 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.remove() 应该调用 jQuery 的 remove,它应该从 DOM 中删除元素,但也删除附加到它的数据和事件。所以我想对 undelegateEvents 和 removeData 的调用不应该是必要的......我对吗?
2021-04-16 04:21:28
尽管元素已从 DOM 中删除,但 @opensas 事件仍然存在于 this.remove() 之后。所有事件都需要 this.undelegateEvents() 才能解除绑定。正如我所说,这感觉有点矫枉过正,但它确实奏效了。
2021-04-17 04:21:28
+1 很好地回答了我的问题,+1 写了你的第一个答案:)
2021-05-02 04:21:28
我的观点并没有在销毁和再次创建它时重新呈现。是因为this.remove()吗?
2021-05-13 04:21:28
我喜欢。尽管您应该使用this.$el而不是$(this.el);)
2021-05-15 04:21:28

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

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

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

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

updateView: function() {
  view.remove();
  view.render();
};
我不认为这是正确的。视图的删除函数只是从 DOM 中删除该视图的元素(请参阅此处)。我认为这家伙想完全删除视图对象。
2021-04-18 04:21:28
this.remove() 最终调用 jquery 的 remove(),它也删除了数据和事件......不过我认为你也必须调用 this.undelegateEvents 来解除其他事件的绑定,比如自定义事件或对模型的更改..
2021-04-23 04:21:28
this.remove()调用this.stopListening()this.$el.remove()第一个删除使用添加的所有事件侦听器this.listenTo(...)第二个删除使用 jQuery 添加的所有事件侦听器。在这两者之间,除非您使用其他一些添加事件侦听器的方法,否则您应该被涵盖在内。所以这个答案是正确的,并从我那里得到 +1。
2021-05-03 04:21:28

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

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

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

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

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

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

视图.remove()

从 DOM 中移除一个视图及其 el,并调用 stopListening 来移除该视图已经监听的任何绑定事件。