如何在.computed()函数中使用knockout的$parent/$root伪变量?

11 浏览
0 Comments

如何在.computed()函数中使用knockout的$parent/$root伪变量?

在使用JavaScript声明的ko.computed可观察对象时,如何获得类似于$data$parent$root伪变量的等效对象?

我有一个包含子元素集合的父视图模型,父视图模型有一个selectedChild可观察对象。在这种情况下,我可以使用数据绑定表达式为当前选定的子元素添加CSS类:

但我的视图模型将变得更加复杂,我希望“是否被选中?”能够执行更多的操作,而不仅仅是为单个元素添加一个CSS类。我真的希望在子视图模型上创建一个isSelected计算属性,这样我就可以添加依赖于它的其他计算属性。

我尝试了直接使用引用了$data$root的JavaScript代码,期望knockout可能会定义这些变量,并在调用我的computed求值函数时将其作为范围内的变量:

{
  name: 'Bob',
  isSelected: ko.computed(function(){ return $data === $root.selectedChild(); })
}

但没有这样的运气:在我的求值函数内部,$data$root都是undefined

我还尝试在我的求值函数内部使用ko.contextFor,因为它确实提供了对$data$root的访问权限。不幸的是,在我的求值函数内部,contextFor总是返回undefined。(我对这种策略并没有太高的期望 - 如果我不得不绕过knockout,它可能无法很好地跟踪依赖关系。)

我可以手动为每个子视图模型设置一个指向父视图模型的属性。但我知道knockout可以为我完成这个任务,所以我至少想探索一下是否可以使用它的机制,然后再去编写自己的代码。

看起来应该可以将上述绑定表达式转化为一个计算可观察对象 - 毕竟,knockout已经这样做了

另一个巧妙的技巧是,声明式绑定只是计算可观察对象的实现方式。

但是,在编写自己的计算可观察对象时,如何处理$data$root伪变量呢?

0