2012-08-08 60 views
2

只是好奇,如何才能创建一个'foreach'绑定,通过链接列表迭代当前'foreach'绑定迭代数组的方式?我已经创建了a jsFiddle for tinkeringKnockout.js'foreach'绑定链接列表

我认为链表可能是一个有用的习惯用法与Knockout.js一起使用。特别是,如果正确完成,DOM只会更新正被添加/删除的元素(即添加/删除元素时不会更新整个列表),而添加/删除列表中的内容具有复杂性O(1),而不是O(n)。

回答

0

这是一个不错的主意,但不幸的是我不认为这是可能的。

您必须订阅列表头部的observable和每个元素的'next'可观察值。

问题是,除非您能分辨哪一个可观察物引发了变化,否则您不会获得任何优势。如果您在列表中间编辑某些东西,那么整个观点就是foreach绑定需要能够更新那部分DOM,而无需迭代整个结构。绑定当前不允许这样做 - 如果绑定订阅了多个可观察对象,那么将调用它的方法,如果它们中的任何一个发生改变,而不知道它们中的哪些改变了。

此外,即使这可以工作,所有这些额外的ko.observable()结构和订阅将是相当严重的开销。三个可观察对象,而不是只有另一个数组元素。

为了避免不必要的DOM更改,您可以将新结构与旧的进行比较,只需进行相关更改,但是在使用数组时可以完成此操作(我不认为内置的foreach绑定会使此优化)。

+0

感谢您的帖子。我不明白第3段中的问题 - 请你详细说明一下吗?你为什么需要引发变化的可观察事物?你的意思是以前的元素?我希望这个结构必然是一个双向链表(出于这个和其他原因),这可能会解决你所关心的问题?有多少关注是所有ko.observables的开销 - 我曾认为(可能是错误地)认为它们非常轻量级 - 除非它们位于订阅层的底部,这些迭代器不应该这样做。 – 2012-08-13 13:20:12

+0

另一种方法是有一个“计算”的可观察性,它遍历链表,将每个元素放入一个扁平的,有序的数组中,然后你可以对它进行“foreach”。这会让你达到你想要的吗? – WickyNilliams 2012-08-13 13:24:52

+0

我已经更新了答案。我不明白如何使它成为'计算机'的帮助,这只是使它成为一个非常昂贵的阵列。我看不到任何理由不仅仅是首先使用数组。确实有一个新的绑定空间,它不会从头开始更新该部分的DOM,但它仍然会使用数组。 – SystemParadox 2012-08-20 07:59:42

1

基于数组的foreach已经非常高效了; DOM元素仅在需要时添加/删除;当然,整个阵列会被扫描以进行更改,但速度非常快(ko阵列只有粗糙的更改信号)。由于使用了距离算法,随机插入或删除速度很快。