在阅读有关second parameter in knockout applyBindins的文档后,我理解其背后的原因:
或者,您可以传递第二个参数来定义哪个部分 要搜索数据绑定属性的文档。例如, ko.applyBindings(myViewModel, 的document.getElementById( 'someElementId'))。这限制了 激活ID为someElementId及其后代的元素, 如果您想拥有多个视图模型并关联,这非常有用 每个页面都有不同的区域。
但我还没有看到任何关于表现的事情。我的想法(基于什么都没有)是有意义的,如果将绑定重新绑定到整个文档而不是整个文档,ko绑定将更快地工作。
因此,为了提高性能,使用ko.applyBindings(myViewModel, $('#someElementId')[0])
而不使用多个视图模型是有意义的。 (我听说过Knuth先生,所以不要通过优化引用会很好。)
答案 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);
};