Knockout映射无法更新observableArray

时间:2015-12-08 15:47:24

标签: javascript knockout.js knockout-mapping-plugin

我正在尝试通过映射插件更新可观察数组,但插件不会更新可观察数组。

var list = ko.observableArray([]);
ko.mapping.fromJS([{ id: 1 }], list);
console.log(list()); //It is always empty

1 个答案:

答案 0 :(得分:2)

映射插件遍历输入对象的属性,并相应地更新目标视图模型的属性。但是,数组没有属性(至少没有您感兴趣的映射)。

请改为尝试:

var viewmodel = {
    list: ko.observableArray([])
};

ko.mapping.fromJS({
    list: [{ id: 1 }]
}, {}, viewmodel);

console.log(viewmodel.list());

请注意,mapping.fromJS()的第二个参数应该是映射选项。由于我们没有选项,我通过了{}。第三个参数是映射目标。

数组不应传递给映射插件。你可以直接更新它们,没有必要使用映射插件来实现真正的微不足道的事情:

var list = ko.observableArray([]);
list([{ id: 1 }]);

如果您打算维护子视图的数组,那么映射选项会派上用场:

var viewmodel = {
    list: ko.observableArray([])
}

ko.mapping.fromJS({
    list: [{ id: 1 }]
}, {
    list: {
        // make items in the "list" property become ItemModel
        // instances that are recognized by their respective ID
        create: function(options) {
            return new ItemModel(options.data);
        },
        key: function(item) {
            return ko.unrwap(item.id);
        }
    }

}, viewmodel);

console.log(viewmodel.list());