2

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 他にもコメントがあれば、投稿してください:)

どうもありがとうございます。

4

1 に答える 1

1

子の監視可能な配列が新しい値で更新され、新しい監視可能な配列に置き換えられていないことを確認してください。

于 2013-03-08T16:09:18.210 に答える