knockout中的第二个参数applyBindings。绩效影响

时间:2014-02-24 04:55:19

标签: performance knockout.js

在阅读有关second parameter in knockout applyBindins的文档后,我理解其背后的原因:

  

或者,您可以传递第二个参数来定义哪个部分   要搜索数据绑定属性的文档。例如,   ko.applyBindings(myViewModel,   的document.getElementById( 'someElementId'))。这限制了   激活ID为someElementId及其后代的元素,   如果您想拥有多个视图模型并关联,这非常有用   每个页面都有不同的区域。

但我还没有看到任何关于表现的事情。我的想法(基于什么都没有)是有意义的,如果将绑定重新绑定到整个文档而不是整个文档,ko绑定将更快地工作。

因此,为了提高性能,使用ko.applyBindings(myViewModel, $('#someElementId')[0]) 而不使用多个视图模型是有意义的。 (我听说过Knuth先生,所以不要通过优化引用会很好。)

1 个答案:

答案 0 :(得分:3)

applyBindings是applyBindingsToNodeAndDescendantsInternal(这是所有魔法发生的地方)的瘦包装,如果你不提供节点,它使用window.document.body

调用applyBindings(viewModel)和applyBindings(viewMode,rootNode)之间没有区别,除非你有一个非常大的DOM并且只想绑定一小部分。在这种情况下,使用第二个参数,Knockout将在初始设置上扫描更少。

一旦绑定到位,它们就会在本地对可观察到的更改作出反应,这与AngularJS之类的框架不同,后者可能会扫描整个DOM以进行更改。此时根节点无关紧要。

ko.applyBindings = function (viewModel, rootNode) {
    if (rootNode && (rootNode.nodeType !== 1) && (rootNode.nodeType !== 8))
        throw new Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node");
    rootNode = rootNode || window.document.body; // Make "rootNode" parameter optional

    applyBindingsToNodeAndDescendantsInternal(viewModel, rootNode, true);
};