2013-01-15 31 views
7

我與knockoutjs工作,我試圖從JSON數據填充視圖模型實例。 據knockoutjs文檔我可以用這個語句:當映射ko.mapping.fromJS值均爲空

ko.mapping.fromJS(data, viewModel); 

這裏我的代碼:

var pledgeVM=function(){ 

     this.name=ko.observable(); 
     this.Assets=ko.observableArray([]); 

     this.StartEdit=function(assetModel){ 


     }; 

}; 

     pledge = {"name":"Moses","Assets":[{"CityId":13,"commetns":null},{"CityId":14,"commetns":null}]}; 

     var pledgeVMinstance=new pledgeVM(); 

     ko.mapping.fromJS(pledge,pledgeVMinstance); 

不填充某種原因數據(pledgeVMinstance.name()是不確定的) 除非我改變聲明於:

ko.mapping.fromJS(pledge,{},pledgeVMinstance); 

可能有人能解釋我爲什麼 事情會這樣。

感謝

回答

21

它的發生是因爲ko.mapping.fromJS具有以下特徵:

ko.mapping.fromJS(data, mappingOptions, viewModel); 

data - 是你的JSON數據,mappingOptions - 是映射的說明插入如何映射日期,viewModel - 是存儲映射數據的對象。

ko.mapping.fromJS(data) - 這句法將創建視圖模型。

ko.mapping.fromJS(data, mappingOptions) - 這將創建特別選擇視圖模型。

ko.mapping.fromJS(data, {}, viewModel) - 而這一次convers您的數據,而無需映射選項,並把它查看模式。

閱讀文檔以便更好地理解:http://knockoutjs.com/documentation/plugins-mapping.html

+7

這只是部分正確。如果你用兩個參數調用:'ko.mapping.fromJS(data,mappedObject)',其中第二個參數是映射插件已經創建的「mappedObject」(因此它具有定義的__ko_mapping__屬性)第二個參數是viewModel而不是選項。請參閱:https://github.com/SteveSanderson/knockout.mapping/blob/master/knockout.mapping.js#L96。這是更新示例'ko.mapping.fromJS(data,viewModel);'的文檔中的方法。 – nemesv

+0

不知道。謝謝。 –

+0

因此,在使用2個參數的文檔中 - 第二個選項是?所以爲什麼它sais「ko.mapping.fromJS(data,viewModel);」第二個是viewModel? – happyZZR1400

5

基於閱讀Knockout's website的文檔,我相信,美其名曰:

var viewModel = ko.mapping.fromJS(data); 

會自動創建你的ViewModel。這意味着你不需要自己聲明一個ViewModel,因爲映射插件創建了一個具有可觀察屬性的插件。

你把這種現象稱之爲爲首次後,你就可以使用

ko.mapping.fromJS(data, viewModel); 

要更新您的視圖模型的數據,說你已經通過Ajax請求加載更多的數據之後。

修復解決方案,這應該是:

var pledge = {"name":"Moses","Assets":[{"CityId":13,"commetns":null},{"CityId":14,"commetns":null}]}; 

var pledgeVMinstance = ko.mapping.fromJS(pledge); 
+0

我需要使用startEdit中的功能在我pledgeView型號 – happyZZR1400