Knockout.js Knockout不是映射数组中对象的属性

Knockout.js Knockout不是映射数组中对象的属性,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,似乎knockout没有正确映射数组中对象的属性 请参见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(viewmode

似乎knockout没有正确映射数组中对象的属性

请参见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”属性

欢迎任何意见

From,关于
toJS()
函数:

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

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

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

尽管Niko的回答是正确的,但有一种方法可以克服这个问题

我不得不说,这是一个有点丑陋的黑客,但它做的工作,它很容易理解:

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

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

感谢您的快速回答。有没有办法修改行为来映射每个属性?文档中似乎没有提到这一点。@RichardAstbury我不这么认为。您需要将其硬编码到一个定制版本的映射插件中。