在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