2014-11-17 27 views
0

按照主從樣品,如this創建活動項,但與的ViewModels工廠模式:KnockoutJS訪問經由活化劑forItems

this.activateProduct = activator.create().forItems(this.products);

<div data-bind="foreach: products"> 
    <a data-bind="click: $parent.activateProduct">click activates</a>` 
</div> 

調試<pre data-bind="text: ko.toJSON(activateProduct, null, 2)"></pre>模型輸出和它的數據。

然而<div data-bind="text: activateProduct.name"></div>回報什麼,試圖展開,呼籲爲valueAssessor功能等,並不能找到它ko.toJSON莫名其妙地找到了觀測。

在儲存「當前項目」時,是否需要使用activateItem將這一切分解爲單獨的步驟?

任何將檢索裏面的observables的語法?

回答

0

找到了!

ko.unwrap(activateProduct).name()

問題是,ko.unwrap(activateProduct) == null直到它被點擊激活。因此簡單地設置它會導致綁定錯誤。

Unable to process binding "text: function(){return ko.unwrap(activateProduct).name() }" 
Message: ko.unwrap(...) is null; 

因此,在試圖綁定它的可觀察對象之前,您必須首先檢查激活器的空值。

<div data-bind="text: (ko.unwrap(activateProduct) !== null) ? ko.unwrap(activateProduct).name():''"></div> 
+0

只是爲了澄清: 如果你使用'文本:activateProduct()name'將你鎖定到產品的靜態版本,當你改變了'activateProduct'觀察到的值權不會改變? – Nate

+0

它似乎不是......第一次通過綁定沒有賦值給變量的激活器,所以在那個階段它會出錯「不是函數」。然後當綁定確實出現時,它不知道用新數據刷新顯示(因爲綁定失敗)。你可以跳過'ko.unwrap',然後檢查函數是否存在......也許如果我在構造函數的早期給它分配了一些東西,並且綁定,而不是等待激活器來定義'activateProduct'(或者bound一個代理函數,然後在裏面有激活器,也許)。 – MrYellow

+1

'with'綁定怎麼樣? – Nate