如何在.computed()函数中使用knockout的$parent/$root伪变量?
如何在.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
伪变量呢?