2013-01-15 8 views
7

Ich arbeite mit Knockoutjs und ich versuche, ViewModel-Instanz aus JSON-Daten zu füllen. Nach knockoutjs Dokumentation kann ich diese Anweisung verwenden:Beim Mapping ko.mapping.fromJS Werte sind Null

ko.mapping.fromJS(data, viewModel); 

Hier mein Code:

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

aus irgendeinem Grunde Daten nicht aufgefüllt (pledgeVMinstance.name() nicht definiert ist) , es sei denn ich die Aussage ändern zu:

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

jemand kann mir erklären kann, warum Dinge auf diese Weise gehen.

Dank

Antwort

21

Es geschah, weil ko.mapping.fromJS die folgende Signatur hat:

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

Wo data - ist Ihre JSON-Daten, mappingOptions - ist die Anweisungen zur Zuordnung Plug-in, wie Sie Ihr Datum zuordnen, viewModel - ist Objekt, um zugeordnete Daten zu speichern.

ko.mapping.fromJS(data) - Diese Syntax erstellt View-Modell.

ko.mapping.fromJS(data, mappingOptions) - Dies wird Ansichtsmodell mit bestimmten Optionen erstellen.

ko.mapping.fromJS(data, {}, viewModel) - und dieses eine umwandelte Ihre Daten ohne Zuordnungsoptionen und legte es zur Ansicht Modell.

Lesen Sie die Dokumentation zum besseren Verständnis: http://knockoutjs.com/documentation/plugins-mapping.html

+7

Dies ist zu verwenden. Wenn Sie mit zwei Argumenten aufrufen: 'ko.mapping.fromJS (data, mappedObject)' wobei das zweite Argument ein "mappedObject" ist, das bereits vom Mapping-Plugin erstellt wurde (also die Eigenschaft '__ko_mapping__' definiert ist), wird es behandelt das zweite Argument als ViewModel und nicht als Optionen. Siehe: https://github.com/SteveSanderson/knockout.mapping/blob/master/knockout.mapping.js#L96. So funktioniert in der Dokumentation das Update-Beispiel 'ko.mapping.fromJS (data, viewModel);'. – nemesv

+0

Wusste das nicht. Vielen Dank. –

+0

Also in der Dokumentation, wenn Sie 2 Parameter verwenden - die zweite Option? also warum es heißt "ko.mapping.fromJS (data, viewModel);" Die zweite ist ViewModel? – happyZZR1400

5

Basierend auf dem Lesen der Dokumentation auf Knockout's website, glaube ich, dass Aufruf:

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

Werden Sie ein Ansichtsmodell automatisch erstellen. Dies bedeutet, dass Sie ein ViewModel nicht selbst deklarieren müssen, da das Mapping-Plugin ein Objekt mit beobachtbaren Eigenschaften erstellt.

Nachdem Sie dies für die ersten Mal aufgerufen haben Sie dann

verwenden können
ko.mapping.fromJS(data, viewModel); 

Um Ihre Ansichtsmodell Daten zu aktualisieren, sagen, nachdem Sie mehr Daten über eine Ajax-Anforderung geladen haben.

Die Lösung sollte dies zu beheben sein:

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

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

Ich brauche nur zum Teil richtig StartEdit Funktion in meinem pledgeView Modell – happyZZR1400

Verwandte Themen