0

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

我们最近遇到了一种情况,需要在不移除 DOM 元素本身的情况下从 DOM 元素中分离 Backbone 视图。因此,我们不能使用,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% 有信心,所以我想知道其他人是如何处理这种情况的。

这个方法听起来不错?有没有更好的方法来实现这一目标?

4

1 回答 1

1

扩展视图并覆盖删除,使其不再调用 this.$el.remove();

例子

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

应该就这么简单。

于 2013-05-17T21:59:09.290 回答