敲除不映射数组中对象的属性
问题描述:
似乎敲除没有正确映射数组中对象的属性。敲除不映射数组中对象的属性
见这个例子从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对象,但“名称”属性不被映射。
任何想法都非常欢迎!
答
从http://knockoutjs.com/documentation/plugins-mapping.html,有关toJS()
功能:
这将创建一个包含映射对象是你原来的JS对象的一部分的只有属性未映射的对象。
由于“名称”不是您映射的原始对象的一部分,因此它不会被取消映射。你需要告诉映射插件包含此特定属性:
var js = ko.mapping.toJS(viewmodel, { include: ['name'] });
答
虽然尼科的答案是正确的 - 有我不得不说这是一个有点丑陋的方式来解决这个问题..
黑客但它的工作,它是很容易理解的:
ko.mapping.toJS(ko.mapping.fromJSON(ko.toJSON(viewmodel)))
我从地图观察到视图模型到JSON可观察到的(与映射的所有属性)为对象。
感谢您的快速回答。有没有任何修改行为来映射每个属性的方法?文档似乎没有提到这一点。 – 2012-04-16 14:42:05
@RichardAstbury我不这么认为。您需要将其硬编码到定制版本的映射插件中。 – Niko 2012-04-16 15:09:58
我已经找到了ko.toJSON(viewModel),这似乎是做这项工作。 – 2012-04-25 08:56:38