2012-04-16 75 views
6

Dường như việc loại bỏ không phải là ánh xạ các thuộc tính của các đối tượng trong một mảng chính xác.Loại bỏ không được ánh xạ các thuộc tính của một đối tượng trong một mảng

Xem ví dụ này từ chrome console:

> var viewmodel = ko.mapping.fromJS({list:[]}); 
undefined 

> viewmodel.list().unshift({ name : ko.observable("Foo") }); 
1 

> viewmodel.list()[0].name(); 
"Foo" 

> var js = ko.mapping.toJS(viewmodel); 
undefined 

> js.list[0].name; 
undefined 

Vì vậy, các đối tượng javascript đã được tạo ra, nhưng 'tên' bất động sản không được ánh xạ.

Bất kỳ ý tưởng nào đều được hoan nghênh!

Trả lời

11

Từ http://knockoutjs.com/documentation/plugins-mapping.html, về toJS() chức năng:

này sẽ tạo ra một đối tượng unmapped chỉ chứa các thuộc tính của đối tượng ánh xạ đó là một phần của đối tượng JS ban đầu của bạn.

Vì "tên" không phải là một phần của đối tượng gốc mà bạn đã lập bản đồ, nó không được hiển thị. Bạn cần phải nói với các plugin lập bản đồ bao gồm tài sản cụ thể này:

var js = ko.mapping.toJS(viewmodel, { include: ['name'] }); 
+0

Cảm ơn câu trả lời nhanh. Có cách nào để sửa đổi hành vi để ánh xạ mọi thuộc tính? Các tài liệu dường như không đề cập đến điều này. –

+0

@RichardAstbury Tôi không nghĩ vậy. Bạn sẽ cần phải mã hóa mã này thành phiên bản tùy chỉnh của plugin ánh xạ. – Niko

+2

Tôi đã tìm thấy ko.toJSON (viewModel) mà dường như thực hiện công việc. –

3

Mặc dù câu trả lời của Niko là đúng - có một cách để khắc phục vấn đề này ..

tôi phải nói đó là một chút của một xấu xí Hack nhưng nó không được công việc và nó khá dễ hiểu:

ko.mapping.toJS(ko.mapping.fromJSON(ko.toJSON(viewmodel))) 

tôi lập bản đồ mô hình nhìn từ quan sát để JSON để quan sát được (với tất cả các thuộc tính ánh xạ) để phản đối.

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