淘汰赛:如何检查绑定是不是已应用于页面区域

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.dataForko.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 之前检查表中是不是存在名称 [重复]

检查用户是不是在定义的区域

如何检查位置是不是在我的圈子区域内?

在 OnPaint() 事件中,如何检查给定的矩形是不是与无效区域相交?

如何检查是不是创建了 jcrop 小部件(裁剪区域)?

vue监听指定区域的滚动,以及设置滚动值