如何在不影响DOM的情况下从元素中分离Backbone视图?

时间:2013-05-17 21:27:43

标签: javascript jquery backbone.js

我们正在使用Backbone视图来增强我们的应用程序,我们的应用程序的体系结构要求我们将视图附加到现有的DOM元素。

我们最近遇到了这样一种情况:必须从DOM元素中分离Backbone视图而不删除DOM元素本身。因此,我们无法使用View.remove(),因为它会依次调用this.$el.remove();

我最初创建了以下方法来分离视图,但我担心我可能会导致内存泄漏:

detach: function() {
  this.stopListening();
  this.unbind();
  this.setElement(null);
}

这有效地用空的jQuery对象替换了View的元素,它解除了所有Backbone事件的绑定。但是,我发现jQuery可能正在存储对新空对象的引用。我对jQuery的内部结构并不完全清楚,所以我不能评论这种方法的有效性。

然后我按如下方式修改了方法:

detach: function() {
  this.stopListening();
  this.unbind();
  this.undelegateEvents();
  this.el = null;
  this.$el = null;
}

我认为这会更好地实现所需的结果,因为它删除了对DOM和jQuery的所有引用。我对这种方法没有100%的信心,所以我想知道其他人是如何处理这种情况的。

这种方法看起来好听吗?有没有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

扩展视图并覆盖删除,以便它不再调用它。$ el.remove();

实施例

var EnhanceView = Backbone.View.extend({
 remove: function() {
  this.stopListening();
  return this;
 }
});

应该就这么简单。