【发布时间】:2013-05-22 12:52:44
【问题描述】:
我想发布一个我一直在开发的小部件,以使用 KnockoutJS 创建一个虚拟化列表,并找出我可能缺少的任何优化。
在研究使用 CSS display:none 虚拟化屏幕外元素时,我得到了不同的答案。我听说这样做可以避免浏览器“渲染”周期,但元素仍然会在“dom”更新周期中被触及。在我的测试中,似乎设置 display:none (通过绑定可见的剔除) 确实加快了添加初始数量的项目。
最后,在我的虚拟化绑定处理程序中,我目前通过获取滚动位置和窗口高度来获取当前视口。这允许我将窗口内索引 (indexes * rowHeight) 设置为 display:block。然而,为了隐藏其他不可见的索引,我遍历并将每个索引设置为 display:none。这显然是 O(n) 来执行整个操作,但我没有看到另一种解决方法。有没有办法优化这个?将重置 display:none 卸载到队列中会更好吗,因为它不需要立即发生?
http://jsbin.com/axupap/56/edit
任何见解将不胜感激!
【问题讨论】:
-
updated 我能够通过取消移动底层数组而不是 observable 并在添加后手动调用 valueHasMutated 来进一步优化批量添加。现在最多添加 200 项非常快,添加更多是合理的。
标签: javascript css dom knockout.js virtualization