我正在尝试通过映射插件更新可观察数组,但插件不会更新可观察数组。
var list = ko.observableArray([]);
ko.mapping.fromJS([{ id: 1 }], list);
console.log(list()); //It is always empty
答案 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());