在视图模型问题中更新后的knockoutjs数据操作

时间:2013-02-10 18:51:31

标签: knockout.js knockout-mapping-plugin

我有一个带有两个虚拟机的主viewModel,它是通过映射插件创建的。

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()函数不会返回更新的长度。 WHY吗

看起来所有数据都已成功更新,但如果它是一个数组(我可以轻松获取self.title()或其他可观察数据),则无法在VM函数中访问。也许mapOptions存在一些问题?

'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/

P.S。如果您有任何其他意见,欢迎您发布:)

非常感谢你。

1 个答案:

答案 0 :(得分:1)

确保使用新值更新子级可观察数组,而不是用新的可观察数组替换。