applyBindings的第二个参数用于什么?

Tim*_*Tim 32 knockout.js

我一直在寻找但找不到相关文档applyBindings().第二个参数可以合法地包含哪些内容?它可以是一系列元素吗?它必须是一个单一元素吗?可以通过调用applyBindings两次将绑定应用于两个单独节点的子元素吗?

       ko.applyBindings(myViewModel, div1);
       ko.applyBindings(myViewModel, div2);
Run Code Online (Sandbox Code Playgroud)

Jer*_*oen 45

KnockoutJS是开源的.从相关文件:

ko.applyBindings = function (viewModelOrBindingContext, rootNode) {
    // Some code omitted for brevity...

    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(getBindingContext(viewModelOrBindingContext), rootNode, true);
};
Run Code Online (Sandbox Code Playgroud)

所以,是的,它似乎必须是一个DOM节点.更具体地说,nodeType必须是1(ELEMENT_NODE)或8(COMMENT_NODE),否则抛出Error.

相关文件("激活淘汰赛")是不太明显的,它必须是一个DOM节点,但(见强调,由我添加的)不样的说同样的话:

(可选)您可以传递第二个参数来定义要搜索属性的文档的哪个部分data-bind.例如,ko.applyBindings(myViewModel, document.getElementById('someElementId')).这someElementId会将激活限制为具有ID 及其后代的元素,如果您希望拥有多个视图模型并将每个视图模型与页面的不同区域相关联,这将非常有用.

只要节点不共享树的一部分(例如,它们是兄弟姐妹),您就可以在每个节点上安全地调用applyBindings(事实上,这是使用第二个参数的一个原因).

有关典型用例,请参阅此相关问题.

  • 在答案中添加特定的KO源代码很不错. (2认同)

Jus*_*sso 11

可以在以下链接中找到... http://knockoutjs.com/documentation/observables.html

如果您想知道ko.applyBindings的参数是什么,

第一个参数说明要使用的视图模型对象与它激活的声明性绑定

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