0

を使用してモデルにデータを入力する必要があります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'}],
. . .

そして今、悪いことが起こります: peopleobject は破棄されて に置き換えられ、単に更新される代わりに[{ firstName: 'firstName updated'}]失われます。lastNamefirstName

このような動作の理由と、この場合のモデルを更新する正しい方法について、誰でも光を当てることができますか?

4

1 に答える 1

0

このケースは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/

于 2013-08-21T18:54:25.177 に答える