ko.mapping.fromJS销毁数组成员

时间:2013-08-21 18:49:08

标签: knockout.js knockout-mapping-plugin

我需要使用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

任何人都可以了解这种行为的原因,以及在这种情况下更新模型的正确方法吗?

1 个答案:

答案 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/