2013-02-26 12 views
10

Aktuelle Szenario:JSON.stringify ein Objekt mit Knockout JS Variablen

function Employee(data) { 
var self = this; 

// variables 
this.Forename = ko.observable(data.Forename); 
this.Surname = ko.observable(data.Surname); 

this.Save = function() { 
    var obj = JSON.stringify(self); // Without ko.observables, this works fine. self() doesn't work obviously. 
    console.log(obj); 
}; 
} 

denke ich, was ich versuche, ziemlich gerade zu tun, nach vorne ist, erhalten alle beobachtbaren Werte ohne den Umweg über jeden einzelnen von ihnen zu gehen, und Erstellen einer JSON-Zeichenfolge mit der Stringify-Funktion. Dies ist leicht ohne Observables möglich, gibt es einen einfachen Weg, es mit ihnen zu tun?

Antwort

33

Knockout hat eine in toJSON Funktion eingebaut zu tun genau dies:

var json = ko.toJSON(viewModel); 

ko.toJSON - dies erzeugt eine JSON Zeichenfolge, die Ihre Daten nach Ansicht Modell. Intern ruft es einfach ko.toJS in Ihrem Ansichtsmodell auf und verwendet dann den nativen JSON-Serializer des Browsers für das Ergebnis. Hinweis: Damit dies in älteren Browsern ohne nativen JSON-Serializer (z. B. IE 7 oder früher) funktioniert, müssen Sie auch auf die Bibliothek json2.js verweisen.

+0

Eigentlich ist das sogar noch besser, da es keine andere Bibliothek benötigt. Genial. –

+0

Ich denke, Sie müssen zuerst das beobachtbare in ein normales JS-Objekt konvertieren und dann ko.toJSON darauf aufrufen. –

+0

@ebramtharwat Nein - Siehe bearbeiten –

3

Haben Sie sich die knockout mapping plugin angesehen?

var unmapped = ko.mapping.toJS(viewModel); 
+0

Einer von denen, „d'oh, warum nicht ich denke an Das?" Momente! Prost :) –

4

Sie können dies tun, indem sie zwei Möglichkeiten:

zuerst:

 var json = ko.toJSON(ko.mapping.toJS(viewModel)) 

Zweite

 var json = JSON.stringify(ko.mapping.toJS(viewModel)) 
+0

Und dann ko.toJSON (ko.mapping.toJS ($ root), null, 2) :) –