了解 observable 在 foreach/descendant 绑定中根模型中的位置

Knowing where observable lives in root model in foreach/descendant bindings in knockout

这是一个非常小众的场景,理想情况下我需要能够绑定 属性,但能够知道 属性 在根视图模型中的位置。

例如,假设我有对象:

{
   id: ko.observable(1),
   name: ko.observable("some user"),
   groups: [
      { id: ko.observable(1), name: ko.observable("some group") },
      { id: ko.observable(2), name: ko.observable("some group") },
   ]
}

现在的问题是,如果我有这样的绑定:

<div>
<!-- ko foreach: groups -->
    <input data-bind="value: name, custom-binding: { property: name, other: foo }" />
<!-- /ko -->
</div>

现在我需要能够将此处的 name 解析为 rootModel.groups[currentIndex].name 而不是 name。目前我认为没有办法在绑定中知道 属性 是 "name" 因为它只是看到值,所以我可能需要将其作为字符串传递,或者有一个绑定查找的对象的自定义属性。无论哪种方式,我都需要能够以某种方式为绑定范围内的每个可观察对象(与其范围内应用的 rootModel 相关)获取 属性 路径。

我知道这看起来很疯狂,确实如此,但如果可能的话,这仍然是我需要能够做的事情。所以 foreach 只是子绑定范围发生变化并被包装的一种情况,因此对于所有情况,我需要能够为与此自定义绑定一起使用的属性构建 property-path

那么有办法做到这一点吗?

似乎没有简单的方法来做到这一点,所以我不得不为某些绑定编写预处理器来缓存范围,然后在运行时将其作为新绑定应用(因为预处理器无法访问绑定上下文) .

然后在实际的绑定中,它们被代理并查找是否有任何具有现有范围的父级,然后附加本地 属性 并缓存用于绑定上下文中的子级查找。

这用于:

https://github.com/grofit/treacherous

所以请随意看看它是如何完成的,如果有更好的解决方案请告诉我:)