代码之家  ›  专栏  ›  技术社区  ›  Salvador Dali

淘汰applyBindings中的第二个参数。性能影响

  •  1
  • Salvador Dali  · 技术社区  · 12 年前

    阅读了有关 second parameter in knockout applyBindins ,我明白背后的原因:

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

    但我没有看到任何关于表演的东西。我的想法(没有任何依据)是,如果不将绑定限制到整个文档,而是限制到其中的一小部分,那么ko绑定的工作速度会更快。

    那么使用它有意义吗 ko.applyBindings(myViewModel, $('#someElementId')[0]) 不具有多个视图模型 只是为了表现。(我听说了Knuth先生,所以最好不要引用优化)。

    1 回复  |  直到 12 年前
        1
  •  3
  •   Robert Slaney    12 年前

    applyBindings是applyBindingsToNodeAndDescendantsInternal(这是所有神奇之处)的一个薄包装,如果不提供节点,它将使用window.document.body

    调用applyBindings(viewModel)和applyBinding(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);
    };