この投稿は、この投稿のフォローアップです。
次のようにコードを更新しました。
viewModel.getQuotesSuccess = function (result) {
var myCoverQuotesViewModel = function (data) {
var self = this;
ko.mapping.fromJS(data, {}, self);
self.Childs = ko.observableArray(ko.utils.arrayMap(data.Childs, function (c) {
return new myCoverQuotesViewModel(c);
}));
self.selectedChild = ko.observable();
self.showChildren = ko.computed(function () {
return self.selectedChild()
&& self.selectedChild().Childs().length > 0;
});
var mapping = {
'CoverQuotes': {
create: function (options) {
return new myCoverQuotesViewModel(options.data);
}
}
}
ko.mapping.fromJS(result, mapping, viewModel);
};
ビューモデルは次のようになります。
var viewModel = {
CoverQuotes: [{id: 1, label:'test', Childs:[{id: 2, label:'child1'}]]
};
簡単に言えば、CoverQuotes の配列があり、各要素には CoverQuotes (など) の配列も含まれています。
このマッピングで私が抱えている問題は、Childs オブザーバブル配列にあります。通話時:
return new myCoverQuotesViewModel(options.data);
主な目的のために、それはうまくいきます。ただし、 arrayMap 関数内からコンストラクターを呼び出す場合、その行は次のとおりです。
ko.mapping.fromJS(data, {}, self);
何もしません。
その結果、ネストされた子にはプロパティ selectedChild と showChildren が割り当てられますが、他のすべて (この例の id と label など) がありません。
何が欠けているので、マッピングは子供にも機能しますか?