2013-02-26 2 views
10

Obecny scenariusz:JSON.stringify obiekt o zmiennych nokaut JS

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

myślę, co próbuję zrobić, to całkiem proste, uzyskać wszystkie wartości obserwowalnych bez przechodzenia przez każdego z nich, i tworzenie ciągu JSON przy użyciu funkcji stringify. Jest to łatwe do zrobienia bez obserwowalnych, czy istnieje prosty sposób, aby to zrobić z nimi?

Odpowiedz

33

Knockout posiada wbudowany toJSON funkcji, aby dokładnie to zrobić:

var json = ko.toJSON(viewModel); 

ko.toJSON - to wytwarza ciąg JSON reprezentujący dane Państwa zdanie modelu. Wewnętrznie po prostu wywołuje ko.toJS na modelu widoku, a następnie używa macierzystego serializatora JSON przeglądarki na wynik. Uwaga: aby działało to w starszych przeglądarkach, które nie mają macierzystego serializatora JSON (np. IE 7 lub wcześniejszego), musisz także odwołać się do biblioteki json2.js.

+0

W rzeczywistości jest to jeszcze lepsze, ponieważ nie wymaga innej biblioteki. Niesamowite. –

+0

Myślę, że najpierw musisz przekonwertować obserwowalny na normalny obiekt JS, a następnie wywołać na nim ko.toJSON. –

+0

@ebramtharwat Nope - Patrz edytuj –

3

Czy obejrzałeś knockout mapping plugin?

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

Jednym z tych „d'oh, dlaczego nie myślę że?" chwile! Pozdrawiam :) –

4

Można to zrobić na 2 sposoby:

pierwsze:

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

Second

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

A następnie ko.toJSON (ko.mapping.toJS ($ root), null, 2) :) –