淘汰赛:如何检查绑定是不是已应用于页面区域
Posted
技术标签:
【中文标题】淘汰赛:如何检查绑定是不是已应用于页面区域【英文标题】:Knockout : How to check whether bindings have been applied to page area淘汰赛:如何检查绑定是否已应用于页面区域 【发布时间】:2012-02-12 05:24:32 【问题描述】:有没有办法检查applyBindings
是否已被页面区域调用?
似乎淘汰赛不喜欢在同一页面上多次调用applyBindings
。
【问题讨论】:
【参考方案1】:Knockout 2.0 有两个可用于此目的的函数。 ko.dataFor
和 ko.contextFor
接收一个节点并返回可用于在该范围内绑定的 Knockout 数据 (dataFor) 或该范围内的整个绑定上下文 (contextFor),其中包括 $data
、@ 987654329@、$parents
和 $root
。
所以,你可以这样做:
var isBound = function(id)
return !!ko.dataFor(document.getElementById(id));
;
这是一个示例:http://jsfiddle.net/rniemeyer/GaqGY/
但是,在正常情况下,您确实应该在页面上调用一次ko.applyBindings
。不过,这取决于您要完成的工作。请查看此答案以获取有关管理多个视图模型的方法的一些建议:Example of knockoutjs pattern for multi-view applications。
通常,您会执行<div data-bind="with: mySubModel">
,当mySubModel
被填充时,该区域将出现并被绑定。
【讨论】:
嗨,@RPN,上面的 isBound 函数并不是完全安全的。这是因为在 KO 解除绑定后,ko.dataFor(...) 继续返回它存储的数据。看到这个小提琴:jsfiddle.net/nabog/6hCfM/6 @NoelAbrahams - 在这种情况下,淘汰赛实际上并没有“解绑”自己。它识别出元素不是文档的一部分,并处理用于跟踪元素绑定的依赖关系的计算出的 observable。这意味着绑定不会进一步更新,但并不是说它是未绑定的。如果你真的想从一个元素中删除 KO,那么你需要调用ko.cleanNode
这将删除它的数据(虽然它不会删除任何事件处理程序)。这是一个示例:jsfiddle.net/rniemeyer/6hCfM/7
哇,我看到这个有点晚了,刚被一位同事指出。为什么 KO 不自动检查元素是否已绑定?对于理想的单页应用程序的使用,由于没有完成页面重新加载,双重(或更多)绑定是一个常见问题。或者也许 ko.dataFor() 和 ko.dataContext() 可以在 knockoutjs.com 上的文档中使用?也许还有演示。
只是想补充一点,即使页面的一部分从未真正绑定过,ko.dataFor() 也会查找 DOM 层次结构并返回父数据。完全有可能页面的某些部分被故意标记为 controlsDescendantBindings: true。因此,尽管 ko.dataFor() 将返回父数据,但它仍可用于绑定。
我想这是一个相当老的线程,但我想对@RPNiemeyer 的评论进行更正,因为调用ko.cleanNode
会除去Knockout 事件绑定之外的jQuery 事件绑定。 (见***.com/questions/16479637)以上是关于淘汰赛:如何检查绑定是不是已应用于页面区域的主要内容,如果未能解决你的问题,请参考以下文章
如何在插入 MySQL 之前检查表中是不是存在名称 [重复]