2013-01-15 19 views
7

Pracuję z knockoutjs i próbuję wstawić instancję ViewModel z danych JSON. Według dokumentacji knockoutjs mogę użyć tego stwierdzenia:Podczas mapowania wartości koMapping.fromJS mają wartość null

ko.mapping.fromJS(data, viewModel); 

Oto mój kod:

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); 

dla niektórych danych powodu nie zaludnionych (pledgeVMinstance.name() jest nieokreślone) chyba zmienię oświadczenie do:

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

może ktoś może mi wyjaśnić dlaczego rzeczy się dzieje w ten sposób.

Dzięki

Odpowiedz

21

Stało się to dlatego, ko.mapping.fromJS ma następujący podpis:

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

Gdzie data - jest dane json, mappingOptions - to instrukcje do mapowania plug do mapowania daty, viewModel - jest obiektem do przechowywania zmapowanych danych.

ko.mapping.fromJS(data) - ta składnia stworzy model widoku.

ko.mapping.fromJS(data, mappingOptions) - spowoduje to utworzenie modelu widoku z określonymi opcjami.

ko.mapping.fromJS(data, {}, viewModel) - a ten odczytuje dane bez opcji odwzorowania i umieszcza go w celu wyświetlenia modelu.

Przeczytaj dokumentację dla lepszego zrozumienia: http://knockoutjs.com/documentation/plugins-mapping.html

+7

To tylko częściowo prawda. Jeśli wywołasz z dwoma argumentami: 'ko.mapping.fromJS (data, mappedObject)' gdzie drugi argument jest "mappedObject", który jest już utworzony przez wtyczkę mapowania (więc ma zdefiniowaną właściwość '__ko_mapping__') będzie traktował drugi argument jako viewModel, a nie jako opcje. Zobacz: https://github.com/SteveSanderson/knockout.mapping/blob/master/knockout.mapping.js#L96. Tak jest w dokumentacji, że działa przykład aktualizacji 'ko.mapping.fromJS (data, viewModel);'. – nemesv

+0

Nie wiedziałem tego. Dzięki. –

+0

Tak więc w dokumentacji, kiedy używasz 2 prametrów - druga to opcje? dlaczego jest to "ko.mapping.fromJS (data, viewModel);" drugi to viewModel? – happyZZR1400

5

oparciu o czytanie dokumentacji na Knockout's website, wierzę, że wywołanie:

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

automatycznie utworzy Ci ViewModel. Oznacza to, że nie musisz zadeklarować osobnika ViewModel, ponieważ wtyczka mapowania tworzy taką z obserwowalnymi właściwościami.

Po nazwali to po raz pierwszymożna użyć

ko.mapping.fromJS(data, viewModel); 

Aby zaktualizować swoje dane ViewModel, powiedzmy po załadowaniu większej ilości danych za pośrednictwem ajax żądanie.

Rozwiązanie to naprawić powinno być:

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

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

muszę korzystać z funkcji StartEdit w moim pledgeView Modelu – happyZZR1400