Knockout没有映射数组中对象的属性

时间:2012-04-16 13:29:58

标签: knockout.js knockout-mapping-plugin

似乎淘汰赛没有正确映射数组中对象的属性。

从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对象,但'name'属性未被映射。

非常欢迎任何想法!

2 个答案:

答案 0 :(得分:11)

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

  

这将创建一个未映射的对象,该对象仅包含作为原始JS对象一部分的映射对象的属性。

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

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

答案 1 :(得分:3)

尽管Niko的回答是正确的 - 有一种方法可以解决这个问题。

我不得不说这是一个丑陋的黑客,但是它能完成这项任务并且很容易理解:

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

我将视图模型从observable映射到json到observable(所有属性都已映射)到object。