7

当我使用 #each 帮助程序或绑定到 Ember.ArrayController 的某些计算属性的集合视图呈现项目列表时,我遇到了性能问题。10 - 20 个项目的小列表的性能很好,但在 50 - 100 个左右它开始明显滞后。尝试检查一些待办事项或单击“添加待办事项”

示例代码在这里:http: //jsfiddle.net/Jonesy/ed3ZS/4/

我注意到 DOM 中的 childViews 每次更改都会重新渲染,这很可能是目前的预期行为,但我更希望能够从未完成的 todos 列表的 DOM 中删除一个 todo单独并附加到完成的待办事项列表的底部,这在理论上成本要低得多。

我希望回答的是我是否正在查看 Ember 集合视图的性能问题,或者显示从计算属性填充的列表是一个坏主意,如果是这样,我是否需要手动管理 todo 模型的位置在视图层中,因为它从未完成变为已完成,反之亦然。

4

1 回答 1

13

{{#each}}这是(和CollectionView,这是它的动力)如何工作的副作用。

在内部,CollectionView使用称为数组观察者的东西。数组观察者允许您订阅使用Ember.Array的突变方法(、、、replacepushObject)对数组进行的突变。此处描述popObject了数组观察者的 API 。

这意味着,如果您将新对象推送到集合视图中,它将在 DOM 中插入渲染一个新元素并将其余元素保留在原处。

Array但是,在您发布的示例中,数组并没有发生变化——每次添加或删除新项目时,您都会创建一个全新的对象。当绑定同步时,它会用新数组替换旧数组。To {{#each}},这与删除所有元素然后重新添加它们没有什么不同。

该问题的解决方案是使用单个数组,而不是每次更改时返回不同数组对象的计算属性。您可以查看联系人应用程序,了解如何执行此操作的示例

Obviously this is a very common pattern, and we'd like to add some kind of filtering that does the right thing by default to Ember.ArrayController down the road.

于 2012-05-29T08:00:07.857 回答