2012-04-16 72 views
6

似乎敲除没有正确映射数组中对象的属性。敲除不映射数组中对象的属性

见这个例子从Chrome的控制台:

> 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 

所以正在创建JavaScript对象,但“名称”属性不被映射。

任何想法都非常欢迎!

回答

11

http://knockoutjs.com/documentation/plugins-mapping.html,有关toJS()功能:

这将创建一个包含映射对象是你原来的JS对象的一部分的只有属性未映射的对象。

由于“名称”不是您映射的原始对象的一部分,因此它不会被取消映射。你需要告诉映射插件包含此特定属性:

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

感谢您的快速回答。有没有任何修改行为来映射每个属性的方法?文档似乎没有提到这一点。 – 2012-04-16 14:42:05

+0

@RichardAstbury我不这么认为。您需要将其硬编码到定制版本的映射插件中。 – Niko 2012-04-16 15:09:58

+2

我已经找到了ko.toJSON(viewModel),这似乎是做这项工作。 – 2012-04-25 08:56:38

3

虽然尼科的答案是正确的 - 有我不得不说这是一个有点丑陋的方式来解决这个问题..

黑客但它的工作,它是很容易理解的:

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

我从地图观察到视图模型到JSON可观察到的(与映射的所有属性)为对象。