似乎如果计算字段的属性“owner”设置为视图模型的子元素,则使用ko.mapping更新ViewModel会删除计算值。
就像在这种情况下,我们有一个父母数组(每个父母都有一些子元素),我们希望每个父母的计算字段显示孩子的年龄总和。
当我们第一次应用ViewModel时,一切正常,但如果我们在创建计算字段后重新应用映射,则会删除它们。
<div data-bind="foreach: parent">
<div class="cell"><span class="" data-bind="text : $data.comp"></span></div>
</div>
<span data-dind="text: comp"></span>
<script type="text/ecmascript">
var viewModelJs = { 'parent': [{ 'name': 'pippo', 'childAge': [{ 'age': 15 }, { 'age': 18 }] }, { 'name': 'pluto', 'childAge': [{ 'age': 5 }, { 'age': 13 }] }] };
var viewModel = ko.mapping.fromJS(viewModelJs);
for (var index in viewModel.parent()) {
var parent = viewModel.parent()[index];
parent.comp = ko.computed(
{
read: function () {
var parent = this;
var sum = 0;
for (var j in parent.childAge()) {
var age = parent.childAge()[j].age();
sum += parseInt(age);
}
return sum;
},
owner: parent
});
};
ko.applyBindings(viewModel);
viewModelJs = { 'parent': [{ 'name': 'paperino', 'childAge': [{ 'age': 5 }, { 'age': 18 }] }, { 'name': 'mario', 'childAge': [{ 'age': 5 }, { 'age': 13 }] }] };
//Everything works fine so far...
ko.mapping.fromJS(viewModelJs, viewModel);
//now the computed fields are gone.
</script>
有没有办法用ko.mapping保存那些计算字段?
答案 0 :(得分:1)
如果属性 name 唯一标识数组中的一个项目,请尝试通过以下方式替换您对函数 ko.mapping.fromJS 的第一次调用:
var mapping = {
'parent': {
key: function(data) {
return ko.utils.unwrapObservable(data.name);
}
}
};
var viewModel = ko.mapping.fromJS(viewModelJs, mapping);
并在第二个 viewModelJs 定义中使用相同的名称值。
请参阅jsbin