2013-02-26 36 views
10

kịch bản hiện tại:JSON.stringify một đối tượng với biến Knockout 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); 
}; 
} 

Tôi nghĩ rằng những gì tôi đang cố gắng làm là khá thẳng về phía trước, nhận được tất cả các giá trị quan sát được mà không đi qua mỗi một đơn của họ, và tạo chuỗi JSON bằng hàm stringify. Điều này rất dễ làm mà không có các quan sát, có cách nào đơn giản để làm điều đó với chúng không?

Trả lời

33

Knockout đã tích hợp sẵn trong toJSON chức năng để thực hiện chính xác này:

var json = ko.toJSON(viewModel); 

ko.toJSON - điều này tạo ra một chuỗi JSON đại diện cho dữ liệu mô hình quan điểm của bạn. Bên trong, nó chỉ đơn giản gọi là ko.toJS trên mô hình khung nhìn của bạn, và sau đó sử dụng trình nối tiếp JSON gốc của trình duyệt trên kết quả. Lưu ý: để làm việc trên các trình duyệt cũ hơn không có trình tuần tự JSON gốc (ví dụ: IE 7 trở xuống), bạn cũng phải tham khảo thư viện json2.js.

+0

Thực ra, điều này thậm chí còn tốt hơn vì nó không yêu cầu thư viện khác. Tuyệt vời. –

+0

tôi nghĩ rằng bạn có đầu tiên để chuyển đổi các quan sát vào đối tượng JS bình thường sau đó gọi ko.toJSON trên đó. –

+0

@ebramtharwat Nope - Xem chỉnh sửa –

3

Bạn đã xem số knockout mapping plugin chưa?

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

Một trong những "d'oh, tại sao tôi không nghĩ ra cái đó?" khoảnh khắc! Chúc mừng :) –

4

Bạn có thể làm điều này bằng 2 cách:

đầu tiên:

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

Second

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

Và sau đó ko.toJSON (ko.mapping.toJS ($ root), null, 2) :) –

Các vấn đề liên quan