在knockout.js绑定表达式中,我可以使用$data
, $parent
, and $root
pseudovariables。当我使用在JavaScript中声明的ko.computed
observable时,如何获得这些伪变量的等价物?
我有一个父视图模型与一个孩子的集合,父视图模型有一个selectedChild
观察。鉴于这种情况,我可以使用数据绑定表达式添加到任何一个孩子正在选择一个CSS类:“我会选择”
<ul data-bind="foreach: children">
<li data-bind="text: name,
css: {selected: $data === $root.selectedChild()},
click: $root.selectChild"></li>
</ul>
<script>
vm = {
selectedChild: ko.observable(),
children: [{name: 'Bob'}, {name: 'Ned'}],
selectChild: function(child) { vm.selectedChild(child); }
};
ko.applyBindings(vm);
</script>
但我的ViewModels会得到比较复杂,我想能够做的不仅仅是将单个CSS类添加到单个元素。我真的想在子viewmodel上创建一个isSelected
计算属性,这样我就可以添加其他依赖于它的计算属性。
我已经尝试了编写JavaScript,指的$data
和$root
,在关闭的机会,淘汰赛可能定义这些变量并以某种方式让他们在范围上时,它调用我computed
计算器功能:
{
name: 'Bob',
isSelected: ko.computed(function(){ return $data === $root.selectedChild(); })
}
但没有这样的运气:在我的评估者function
里面,$data
和$root
都是undefined
。
我也尝试在我的评估程序中使用ko.contextFor
,因为它确实可以访问$data
和$root
。不幸的是,在我的评估器功能中,contextFor
也总是返回undefined
。 (无论如何,我并没有对这个策略寄予厚望 - 如果我必须像这样背对背,那么淘汰赛将会如何跟踪依赖关系还不清楚。)
我总是可以手动设置属性,每个子视图模型引用父视图模型。但我知道淘汰赛有能力为我做这件事,而且我想至少在我写自己的作品之前先探讨一下我是否可以使用它的机制。
现在看来似乎应该是可以翻译上面绑定表达式的计算观察到的 - 毕竟,that's what knockout already does:
另一个绝招是声明绑定简单地计算观测实现。
但我如何去与$data
和$root
pseudovariables打交道时,我在写我自己的计算观察到的?
谢谢你的第二个例子! – vittore 2011-12-27 21:57:38
如何在root上调用函数以及在相同的绑定中单击$ root.selectedItem? – FutuToad 2013-03-13 16:52:55
例如,这不起作用:点击:函数(){$ parent.openAlertDialogueEdit($ data)} // $数据似乎是一个副本,而不是实际的参考 – FutuToad 2013-03-13 16:54:13