3

需要调用.delegateEvents()父“集合”视图中的所有子视图,以便在从页面中删除父视图然后将其重新打开后重新委托事件。

我可以看到两种方法,就正确的做法而言,这两种方法对我来说都不太正确:

  • 每当addOne(在父视图中调用 ) 时,将刚刚创建的子视图保存到列表中。当视图被添加回页面时需要稍后重新委派事件。使用数组向后滚动该列表并调用.delegateEvents()每个子视图项。这种方法的问题是创建一个单独的数组来保存视图中的所有内容,当视图已经有一个 Backbone 认可的方式来影响它的子视图时this.collection.each()
  • 使用视图内的内置View.collection.each()滚动浏览每个子模型。在每个模型上触发一个事件,导致其相应的视图调用.delegateEvents()自身。这种方法的问题在于,纯粹的面向视图的操作正在通过模型进行路由。

这些方法中的任何一种都好还是有更好的方法我应该这样做?

非常感谢!

4

2 回答 2

1

去第一个。无论如何,您都希望保留对 CollectionView 子视图的引用,以便正确删除和重新初始化。后一种模式的问题是,如果模型由多个集合视图表示,所有这些集合视图都将被不必要地触发。

于 2012-08-01T20:02:27.593 回答
1

您可以通过更改删除列表视图的方式来避免整个问题。

如果您调用该jQuery.remove()函数(或该Backbone.View.remove()函数,这是同一件事),它会取消所有事件的委托以避免内存泄漏。但是,如果您认为稍后要将视图添加回页面,则可以使用jQuery.detach()从 DOM 中删除元素,而无需取消对所有事件的委托。然后你以后不需要重新委托它们,你只需将元素附加到 DOM 就可以了。我相信它也快一点。

例如,我在一些列表视图中使用了以下函数:

detach : function(){
  this.$el.detach();
},

attach : function(newParentEl){
  this.$el.appendTo(newParentEl);
}
于 2012-08-01T21:06:47.817 回答