我需要使用ko.mapping.fromJS
使用数据填充我的模型。当我运行以下代码段(http://jsfiddle.net/XBYhv/)时,一切正常:people.firstName
已更新,新的prop2
属性已添加到模型中。
var Person = function() {
this.lastName = ko.observable('lastName');
this.firstName = ko.observable('firstName');
};
var DataModel = function() {
this.people = ko.observable(new Person());
this.prop1 = ko.observable('prop1');
};
var vm = function(){
this.data = new DataModel();
this.log = function(){
console.log(this.data, this.data.people());
};
this.update = function(){
ko.mapping.fromJS(
{
people: { firstName: 'firstName updated'},
prop2: 'prop2'
}
,{}, this.data);
}
};
ko.applyBindings(new vm());
然后我想通过将people
转换为数组(http://jsfiddle.net/XBYhv/1/)来略微更改模型:
. . .
this.people = ko.observableArray([new Person()]);
. . .
ko.mapping.fromJS({
people: [{ firstName: 'firstName updated'}],
. . .
现在发生了一件坏事:people
对象被销毁并被[{ firstName: 'firstName updated'}]
取代,丢失lastName
而不是仅仅更新firstName
。
任何人都可以了解这种行为的原因,以及在这种情况下更新模型的正确方法吗?
答案 0 :(得分:0)
在the docs中描述了这种情况:要映射对象(即VM的属性,即对象),通常需要指示ko.mapping
如何创建(或比较)这些对象,例如:通过提供create
功能:
ko.mapping.fromJS(
{
people: [{ firstName: 'firstName updated'}]
}
,{
'people': {
create: function (options) {
return new Person(options.data)
}
}
}, this.data);
请参阅以下小提示解决方案:http://jsfiddle.net/XBYhv/2/