5

有没有办法在 knockout.js 中确定

  • 哪些值(ko.observableko.computed)以何种方式相互依赖(先例/依赖项)和
  • 哪些 HTML 节点(文本绑定,对于初学者)取决于当前值1,所以我可以在屏幕上突出显示它们。

?

1 这意味着我需要一种从 HTML 节点到 connected 的方法ko.subscribable,而不仅仅是像视图模型那样ko.dataFor()。这似乎也是不可能的。


我已经构建了一个像电子表格一样工作的 Web 应用程序 - 许多数值根据一组业务规则相互依赖。其中一些是计算出来的,其中一些是用户提供的。

目前我正在使用我自己的 JS 库来执行所有依赖项跟踪和动态屏幕更新。这可行,但我想将其与 knockout.js 交换以增加多功能性和优雅性。

Knockout 在某处跟踪此信息。我该如何使用它?


例如,想象一个汇总了几个整数的电子表格(HTML 表格):

  | 美国广播公司
--+---------
1 | 4 1 5
2 | 2
3 | 3 8
  • 当用户点击单元格 B3 时,我想知道它依赖于 B1 和 B2,而 C3 依赖于它。
  • 当用户单击单元格 C3 时,我想知道它取决于 A1、B1、C1、B2 和 B3。
4

2 回答 2

7

为 Knockout (2.0+) 编写了一个插件,其主要目的是消除计算 observables 的重复更新。但是由于插件替换了ko.computed对象,我还添加了获取可观察对象的依赖项/依赖项列表的功能。每个计算对象都有一个getDependencies返回可观察对象数组的方法,每个可观察/计算的可观察对象都有一个返回计算可getDependents观察对象数组的方法。

于 2012-06-20T02:46:16.443 回答
4

这是一个非常有趣的问题——而且,它似乎不是一个容易回答的问题。我查看了敲除源,看起来这些数据存储在_subscriptionsToDependencies属性中,但这似乎并没有公开。

我确实注意到getDependenciesCount了哪些是暴露的 - 查看这个小提琴以查看它的实际效果。

我仍在对此进行调查,但似乎它可能需要一个淘汰赛本身,除非我们能够获得底层的 observable。但这是我到目前为止发现的内容,您可能会觉得有帮助:

通过调试器运行它,似乎在运行时敲除的缩小版本将_subscriptionsToDependencies属性重命名为V. 在运行时,该getDependenciesCount属性的值为:function (){return v.length}

我希望这有帮助。

编辑:对于那些到达这个问题寻找答案的人,从 2.1 版开始,在 KnockoutJS 中似乎不可能

于 2012-06-18T16:15:15.623 回答