知道可观察的在根模型中的位置,在 foreach/后代绑定中被淘汰

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

本文关键字:foreach 后代 绑定 淘汰 位置 模型 观察      更新时间:2023-09-26
这是一个

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

例如,假设我有对象:

{
   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

因此,请随时查看它是如何完成的,如果有更好的解决方案,请告诉我:)