Dependencies 可视化敲除中计算字段的依赖项

Dependencies 可视化敲除中计算字段的依赖项,dependencies,knockout.js,Dependencies,Knockout.js,在knockout.js中是否有方法确定 哪些值(ko.可观察值或ko.计算值)以何种方式相互依赖(先例/依赖项),以及 哪些HTML节点(首先是文本绑定)取决于当前值1,所以我可以在屏幕上突出显示它们 ? 1这意味着我需要一种从HTML节点到连接的ko.subscribable的方法,而不仅仅是像ko.dataFor()那样的视图模型。这似乎也是不可能的 我构建了一个web应用程序,它的工作方式类似于电子表格——许多数字值根据一组业务规则相互关联。其中一些是计算出来的,一些是用户提供的

在knockout.js中是否有方法确定

  • 哪些值(
    ko.可观察值
    ko.计算值
    )以何种方式相互依赖(先例/依赖项),以及
  • 哪些HTML节点(首先是文本绑定)取决于当前值1,所以我可以在屏幕上突出显示它们
?

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


我构建了一个web应用程序,它的工作方式类似于电子表格——许多数字值根据一组业务规则相互关联。其中一些是计算出来的,一些是用户提供的

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

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


例如,假设一个电子表格(一个HTML表格)汇总了几个整数:

| A B C --+--------- 1 | 4 1 5 2 | 2 3 | 3 8 |A、B、C --+--------- 1 | 4 1 5 2 | 2 3 | 3 8
  • 当用户单击单元格B3时,我想知道它依赖于B1和B2,而C3依赖于它
  • 当用户单击单元格C3时,我想知道它取决于A1、B1、C1、B2和B3

    • 这是一个非常有趣的问题,而且似乎不是一个简单的答案。我查看了敲除源代码,它看起来像是存储在
      \u subscriptionstodependences
      属性中,但这似乎没有公开

      我确实注意到
      getDependenciesCount
      已公开-请查看它的实际操作

      我仍在研究这个问题,但似乎它可能需要一个敲除叉本身,除非我们能够得到潜在的可观察的。但以下是我到目前为止的发现,你可能会觉得很有帮助:

      通过调试器运行它,似乎在运行时,knockout的简化版本将
      \u subscriptionstodependences
      属性重命名为
      V
      。在运行时,
      getDependenciesCount
      属性的值是:
      function(){return v.length}

      我希望这有帮助


      编辑:对于那些找到这个问题答案的人来说,从2.1版起,在KnockoutJS中似乎不可能找到答案。我已经写了一个(2.0+)版本,其主要目的是消除计算观测值的重复更新。但由于插件替换了
      ko.computed
      对象,我还添加了获取可观察对象的依赖项/从属项列表的功能。每个计算对象都有一个
      getDependencies
      方法返回一个可观察的数组,每个可观察/计算可观察的对象都有一个
      getDependents
      方法返回一个可计算可观察的数组。

      通常我自己回答简单的问题。

      知道依赖项的数量很接近,但不需要。而且,这并没有告诉我任何先例。“哪个HTML元素显示这个值”这个问题在过去我也曾在不同的场合出现过。这似乎同样难以回答。这看起来很有希望。我想这将是足够容易的,以扩大它,使其跟踪先例以及。现在我正在考虑一种自定义的
      文本
      绑定,它可以自动注册连接的HTML元素,这样我就有机会在单击处理程序中调用
      getDependents
      。我不知道“先例”是什么意思。Excel术语:“Dependents:依赖于当前值的值。”“先例:当前值所依赖的值。”好的,我刚才称之为“依赖项”“.是的,但在你的代码中,它们只朝一个方向前进。我将尝试在跟踪两个方向的代码的基础上创建一个插件。不过,这可能需要我一段时间。无论如何我接受你的答案,因为很明显,必须修改knockout以实现我的想法,并且你的代码显示了如何实现这一点。