Knockout:如何检查绑定是否已应用于页面区域

Chi*_*hin 40 knockout.js

有没有办法检查是否applyBindings已调用页面区域?

似乎淘汰赛不喜欢在applyBindings同一页面上多次调用的时候.

RP *_*yer 60

Knockout 2.0有两个可用于此目的的功能. ko.dataForko.contextFor采取在一个节点,并返回,要么将提供给它在该范围(contextFor),其中包括在该范围(dataFor)或完整的结合上下文结合敲除数据$data,$parent,$parents,和$root.

所以,你可以这样做:

var isBound = function(id) {
  return !!ko.dataFor(document.getElementById(id));
};
Run Code Online (Sandbox Code Playgroud)

以下是一个示例:http://jsfiddle.net/rniemeyer/GaqGY/

但是,在正常情况下,您应该真正想要ko.applyBindings在页面上调用一次.这取决于你想要完成的事情.有关管理多个视图模型的方法的一些建议,请查看此答案:多视图应用程序的knockoutjs模式示例.

通常情况下,您会执行a <div data-bind="with: mySubModel">,当mySubModel填充时,该区域将出现并被绑定.

  • 哇有点迟到,我看到了这一点,刚刚被一位同事指出.为什么KO不会自动检查元素是否已绑定?对于理想的单页面应用程序的使用,由于没有完成页面重新加载,双重(或更多)绑定是一个常见问题.或者也许ko.dataFor()和ko.dataContext()可以在knockoutjs.com上的文档中使用?也许有演示甚至. (9认同)
  • 只想添加ko.dataFor()将查找DOM层次结构并返回父数据,即使页面的一部分从未真正绑定.完全有可能页面的某些部分被刻意标记为controlsDescendantBindings:true.因此,尽管ko.dataFor()将返回父数据,但它可用于绑定. (3认同)
  • 我想这是一个非常古老的线程,但我想对@RPNiemeyer的注释添加更正,因为调用`ko.cleanNode`除了Knockout事件绑定之外还会删除jQuery事件绑定.(见http://stackoverflow.com/questions/16479637) (2认同)