【发布时间】:2016-03-13 14:57:30
【问题描述】:
我正在尝试通过映射插件更新可观察数组,但插件不会更新可观察数组。
var list = ko.observableArray([]);
ko.mapping.fromJS([{ id: 1 }], list);
console.log(list()); //It is always empty
【问题讨论】:
标签: javascript knockout.js knockout-mapping-plugin
我正在尝试通过映射插件更新可观察数组,但插件不会更新可观察数组。
var list = ko.observableArray([]);
ko.mapping.fromJS([{ id: 1 }], list);
console.log(list()); //It is always empty
【问题讨论】:
标签: javascript knockout.js knockout-mapping-plugin
映射插件会遍历输入对象的属性并相应地更新目标视图模型的属性。但是,数组没有属性(至少没有您对映射感兴趣的属性)。
试试这个:
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());
【讨论】: