37

我一直在寻找,但找不到applyBindings(). 第二个参数可以合法包含什么?它可以是一个元素数组吗?它必须是单个元素吗?是否可以通过两次调用 applyBindings 将绑定应用于两个单独节点的子元素?

       ko.applyBindings(myViewModel, div1);
       ko.applyBindings(myViewModel, div2);
4

3 回答 3

49

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);
};

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

相关文档( “ Activating Knockout”)不太明确,它必须是一个 DOM 节点,但是(见强调,由我添加)确实说了同样的话:

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

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

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

于 2013-09-24T19:28:54.503 回答
11

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

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

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

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

于 2013-09-24T19:29:35.037 回答
2

如果有人希望使用类来实现这个

for i of $('.myView')
  ko.applyBindings(new MyView(),$('.myView')[i])
于 2014-07-30T06:40:58.230 回答