2013-01-15 42 views
7

Tôi đang làm việc với knockoutj và tôi đang cố gắng tạo ra cá thể ViewModel từ dữ liệu JSON. Theo tài liệu knockoutjs tôi có thể sử dụng câu lệnh:Khi ánh xạ các giá trị ko.mapping.fromJS là null

ko.mapping.fromJS(data, viewModel); 

Ở đây mã của tôi:

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

đối với một số dữ liệu lý do không dân cư (pledgeVMinstance.name() là undefined) trừ khi tôi thay đổi báo cáo kết quả đến:

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

Có thể ai đó có thể giải thích cho tôi lý do tại sao mọi thứ xảy ra theo cách đó.

Cảm ơn

Trả lời

21

Nó xảy ra bởi vì ko.mapping.fromJS có chữ ký sau đây:

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

đâu data - Dữ liệu json của bạn, mappingOptions - là các hướng dẫn để lập bản đồ cắm cách ánh xạ ngày của bạn, viewModel - là đối tượng lưu trữ dữ liệu được ánh xạ.

ko.mapping.fromJS(data) - cú pháp này sẽ tạo mô hình xem.

ko.mapping.fromJS(data, mappingOptions) - điều này sẽ tạo mô hình chế độ xem với các tùy chọn cụ thể.

ko.mapping.fromJS(data, {}, viewModel) - và điều này trao đổi dữ liệu của bạn mà không có tùy chọn ánh xạ và đặt nó vào xem mô hình.

Đọc tài liệu để hiểu rõ hơn: http://knockoutjs.com/documentation/plugins-mapping.html

+7

Đây chỉ là một phần sự thật. Nếu bạn gọi với hai đối số: 'ko.mapping.fromJS (data, mappedObject)' trong đó đối số thứ hai là một "mappedObject" đã được tạo bởi plugin ánh xạ (vì vậy nó có thuộc tính '__ko_mapping__' đã được xác định), nó sẽ xử lý đối số thứ hai là viewModel và không phải là các tùy chọn. Xem: https://github.com/SteveSanderson/knockout.mapping/blob/master/knockout.mapping.js#L96. Đó là cách trong tài liệu mẫu cập nhật 'ko.mapping.fromJS (data, viewModel);' works. – nemesv

+0

Không biết điều đó. Cảm ơn. –

+0

Vì vậy, trong tài liệu hướng dẫn khi bạn sử dụng 2 prameters -Các thứ hai là lựa chọn? vậy tại sao nó sais "ko.mapping.fromJS (data, viewModel);" thứ hai là viewModel? – happyZZR1400

5

Dựa trên việc đọc tài liệu trên Knockout's website, tôi tin rằng cách gọi:

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

sẽ tự động tạo cho bạn một ViewModel. Điều này có nghĩa là bạn không cần tự khai báo ViewModel vì plugin ánh xạ tạo ra một thuộc tính có thể quan sát được.

Sau khi bạn đã gọi này cho lần đầu tiên sau đó bạn có thể sử dụng

ko.mapping.fromJS(data, viewModel); 

Để cập nhật dữ liệu ViewModel của bạn, nói sau khi bạn đã tải nhiều dữ liệu hơn thông qua một yêu cầu ajax.

Các giải pháp để khắc phục điều này nên là:

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

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

tôi cần phải sử dụng chức năng StartEdit trong pledgeView mẫu của tôi – happyZZR1400

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