3

需要在父级“集合”视图内的所有子视图上调用.delegateEvents(),以便在从页面中移除父视图后重新委派事件,然后放回去。Backbone.js - 访问父级“集合”视图内的所有子视图

我可以看到这样做的两种方式,这两种不健全相当合理了我的正确做法方面:

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

这两种方法都不错,还是有更好的方法,我应该这样做?

非常感谢!

+1

我们目前正在使用相同的问题所困扰,并展望[木偶](https://github.com/ derickbailey/backbone.marionette)看看这个问题是如何解决的。 Derick有一个特殊的'CollectionView',据说可以处理这些事情。 – 2012-08-01 21:22:03

+0

@TorstenWalter - 只花了几个小时阅读Marionette。你们是否决定采用它还是比任何潜在的问题? – 2012-08-02 12:51:16

+1

由于我们刚刚开始过境一个项目,无论如何都必须触及所有视图,因此实施木偶可能对我们来说是最简单的解决方案。目前,我们已经实现了您的第一个解决方案,并在'reset','remove'和'destroy'上更新了视图集合。 – 2012-08-02 16:09:37

回答

1

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

1

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

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

例如,我用我的一些列表视图以下功能:

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

attach : function(newParentEl){ 
    this.$el.appendTo(newParentEl); 
}