2014-05-12 24 views
1

我看這個: http://knockoutjs.com/documentation/extenders.html如何添加擴展到現有的可觀測在淘汰賽

的問題是,我使用fromJs創建我的視圖模型,所以我observerables已經存在。我想我可以做到以下幾點添加一個擴展:

var data = result.Data; 
if (!window.vmRealTimeActivity) { 
    window.vmRealTimeActivity = ko.mapping.fromJS(data, mappingKeys); 
    ko.applyBindings(vmRealTimeActivity, $('#second-btm')[0]); 
} else { 
    ko.mapping.fromJS(data, vmRealTimeActivity); 
} 

vmRealTimeActivity.MyExistingObservable.extend({ numeric: null }); 
vmRealTimeActivity.MyExistingObservable(9999); // doesn't call numeric extender 

我的擴展被調用首次安裝有增,但試圖改變後的值不是。

我讀另一SO貼子,說.extend()創建一個新的observerable所以你必須要做到這一點,但是這並不能正常工作或:

vmRealTimeActivity.MyExistingObservable = vmRealTimeActivity.MyExistingObservable.extend({ numeric: null }); 

除了不能打電話給我格式化程序第二次,值開始回來NaN。

如何將extender以正確的方式附加到現有的observable?

回答

2

由於您使用的是映射插件,因此您可以指定一個create回調。如果你添加以下到現有mappingKeys,它可能會工作(我不知道您的精確映射,所以你可能需要在這裏更改位和那裏):

'MyExistingObservable': { 
    create: function(options) { 
     return new ko.observable(options.data).extend({ numeric: null }); 
    } 
} 

這一結果在擴展時可觀察來自yor數據的映射。

Here's a jsFiddle從一個工作示例(VM1)和當前的非工作示例(VM2)比較

+0

謝謝!這將如何適用於可觀察數組?以前我是這樣做的:$ .each(vmRealTimeActivity.Goals(),function(i,e){e.Count.extend({numeric:null}); }); >>所以我可以擴展自動生成的Goals集合的Count屬性。我試過類似這樣的東西:create:function(options){var 0; 0; 0;}; var newArray = ko.observableArray(options.data); >>根據你的代碼,但沒有運氣。 – KingOfHypocrites

+1

[只是爲了說明如何用可觀察的數組來實現這個功能](http://jsfiddle.net/KrP9D/)。這裏有很多改進的餘地,但我只是想舉個簡單的例子。而不是在'創建'回調中返回新的觀察值,你也可以返回一個新的視圖模型。只需看一下映射插件的[documentation](http://knockoutjs.com/documentation/plugins-mapping.html),該部分稱爲**使用「創建」定製對象構造** –

+0

謝謝,我們來看看。這很具有諷刺意味,因爲之前我手動創建了視圖模型,並且我轉而使用fromJs,這似乎比它的價值更多的工作。大聲笑 – KingOfHypocrites

0

以上的答案是正確的,但對於有興趣的人,我發現了更簡單的方法是隻創建視圖模擬客戶端並使用fromJs刷新它們,而不是同時創建和刷新它們。然後,您可以在此處應用答案以支持將擴展添加到父視圖模型和子視圖模型中:Map JSON data to Knockout observableArray with specific view model type

無論採用哪種方法,您都必須創建其他映射。