8

サーバーから次のデータを取得します。

var data =   [{ id: 0, child: { prop1 : 'a', prop2 : 'b' } }   //Child object has data
             ,{ id: 0, child: null } ];    // Child object is null

ノックアウト マッピング プラグインを使用してデータをマッピングした後、いくつかの問題が発生しています。問題は、内部childオブジェクトが同じ型ではないことです。

これを実行した後:

ko.mapping.fromJS(data, viewModel.data);   

最初のオブジェクトには、データを持つchild型のプロパティがあることがわかりObjectました。ただし、2 番目のオブジェクトには、アンラップ時に null を返すchild型のプロパティがあります。Observable

どちらの場合も、一方が値を持ち、もう一方が null であっても、オブジェクトの型が同じになるようにするにはどうすればよいですか。サーバーの動作を変更することはできません。Objectand nullor or bothを持っていることを期待していObservablesます。

ここでJsFiddle 。

4

2 に答える 2

4

createこのオプションを使用して、プロパティをどのようにマッピングするかをマッピング プラグインに伝える必要がありchildます。

したがって、持つ必要がObjectあり、子プロパティが のときnullに戻る必要がある場合:nullnull

var mappingOptions = {
    child: {
        create: function(options) {
            if (!options.data)
                return null;
            return ko.mapping.fromJS(options.data);
        }
    }
}

ko.mapping.fromJS(data, mappingOptions, viewModel.data);  

JSFiddleのデモ。

または、両方が必要な場合Observables

var mappingOptions = {
    child: {
        create: function(options) {
            return ko.observable(ko.mapping.fromJS(options.data));
        }
    }
}

ko.mapping.fromJS(data, mappingOptions, viewModel.data);   
于 2013-09-06T09:49:32.423 に答える
0

前述のように、解決策はオプションをマッピングすることですが、常にoptions.data の null 値をテストしてから、空の ko.observable() を返すようにしてください。そうしないと、バインディングで多くの問題が発生することになります! 私はそれを見つけるのに多くの時間を費やしました。

var mappingOptions = {
    child: {
        create: function (options) {
            return options.data != null ? ko.observable(ko.mapping.fromJS(options.data)) : ko.observable();
        }
    }
}
于 2016-09-07T21:05:42.133 に答える