7

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

从 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 对象,但未映射“名称”属性。

任何想法都非常受欢迎!

4

2 回答 2

11

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

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

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

var js = ko.mapping.toJS(viewmodel, { include: ['name'] });
于 2012-04-16T13:54:01.947 回答
3

虽然 Niko 的回答是正确的 - 有办法克服这个问题。

我不得不说这有点丑陋,但它可以完成工作并且很容易理解:

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

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

于 2014-09-25T10:56:57.840 回答