2 つの VM を持つマスター ビューモデルがあり、マッピング プラグインを介して作成されます。
viewModelObj = {
first : new firstVM(),
second : new secondVM()
}
viewModel = mapping.fromJS(viewModelObj, mappingOptions);
ko.applyBindings(viewModel);
データは次のようになります。
'firstObj' : {
'title' : 'CURRENT title goes here',
'children' : [
{ 'id': '00001', 'name': 'Rube no 1' },
{ 'id': '00002', 'name': 'Rube no 2' },
{ 'id': '00003', 'name': 'Rube no 3' }
],
'warning' : false
},
'secondObj' : {
'title' : 'Second Item title'
}
firstVM には observableArray の子がある
self.children = ko.observableArray(item.children);
self.calLength = ko.computed(function() {
return 'Total ' + self.children().length;
});
データを更新するまで、すべて正常に動作しているようです。更新されたデータ:
'firstObj' : {
'title' : 'UPDATED TITLE goes here',
'children' : [
{ 'id': '00004', 'name': 'Rube no 4' },
{ 'id': '00005', 'name': 'Rube no 5' },
{ 'id': '00006', 'name': 'Rube no 6' },
{ 'id': '00007', 'name': 'Rube no 7' },
{ 'id': '00008', 'name': 'Rube no 8' },
{ 'id': '00009', 'name': 'Rube no 9' }
],
'warning' : true
},
'secondObj' : {
'title' : '2nd Title UPDATED'
}
HTML では、first.children().length は更新された配列の正しい長さを返します。foreach.children も正常に動作しますが、VM の calLength() 関数は更新された長さを返しません。なぜ?
すべてのデータが正常に更新されたように見えますが、配列の場合は VM 関数でアクセスできません (self.title() または他の観測可能なデータを簡単に取得できます)。mappingOptions に問題があるのではないでしょうか?
'first' : {
create : function(options) {
return mapping.fromJS(options.data, {}, this);
}
},
'second' : {
create : function(options) {
return mapping.fromJS(options.data, {}, this);
}
}
完全なデモは次のとおりです。
http://jsfiddle.net/simoncereska/bfvgT/
ps 他にもコメントがあれば、投稿してください:)
どうもありがとうございます。