knockout使用'观察'

时间:2017-10-15 20:26:18

标签: javascript knockout.js

我想对下面的数组做一个深层次的复制。 result应仅观察count属性。

 data = [{
        id: 1,
        code: 'ABC',
        count: ko.observable(0)
    },{
        id: 2,
        code: 'JKL',
        count: ko.observable(5)
    },{
        id: 3,
        code: 'QWE',
        count: ko.observable(1)
    }]

我尝试ko.mapping.fromJS(ko.mapping.toJS(data));,但idcode也转换为可观察对象。 目前我正在使用以下代码来获得预期结果。

 var obj = ko.mapping.toJS(data);
 var result = [];
 obj.forEach(function(o){
     var obs = ko.mapping.fromJS(o, {
         'observe': "count"
     });
     result.push(obs);
 });
// result will give the expected result

这里我使用forEach来循环data数组中的每个对象。有没有办法避免forEach循环?或者如何仅观察对象数组中的count属性。

1 个答案:

答案 0 :(得分:1)

您可以避开forEach以及仅观察count这样的内容:

var result = ko.mapping.fromJS(data, {observe: 'count'});
console.log(result());

修改

根据文档,我们甚至不需要在数据中提及ko.observable。它应该根据我们的'observe'参数选择它。所以也许您可能想要像这样修改data

var data = [{
                id: 1,
                code: 'ABC',
                count: 0
            }, {
                id: 2,
                code: 'JKL',
                count: 5
            }, {
                id: 3,
                code: 'QWE',
                count: 1
            }];

然后,使用forEach

var result = [];
data.forEach(function(o){
    result.push(ko.mapping.fromJS(o, {observe:'count'}));
});
console.log(result);

取决于您,您希望使用哪种方法。