我不确定如何指示插件使内部数组的特定属性不可观察。
将此JSON作为我的数据:
{
Id: 1,
Description: "test",
Roles: [{ Id: 1, Name: "Role 1" }, { Id: 2, Name: "Role 2" }]
}
Roles数组应该是可观察的,但我不想让任何项目的“Id”字段可观察,我正在尝试不同的方法,但没有运气:
ko.mapping.fromJS(data, { 'copy': [ "Roles.Id" ] });
ko.mapping.fromJS(data, { 'copy': [ "Roles[].Id" ] });
ko.mapping.fromJS(data, { 'copy': [ "Roles[0].Id" ] }); // this only works with the first item
有什么想法吗?
答案 0 :(得分:1)
我不知道是否有针对您的问题的直接解决方案,我尝试导航到Roles
数组的后代但没有工作(如您的尝试)但您可以通过定义来制作简单的技巧Roles
项目对象的模型:
function RolesModel(id, name) {
this.Id = id;
this.Name = ko.observable(name);
}
然后使用映射配置来控制Roles
对象的创建,如下所示:
var mapping = {
'Roles': {
create: function (options) {
return new RolesModel(options.data.Id, options.data.Name)
}
}
}
正如我告诉过你的我不知道直接解决方案,但这会奏效。请检查我的 DEMO
答案 1 :(得分:1)
好吧,也许我找到了解决方案,从@ebram tharwat建议开始。
我将映射选项拆分为两个:
var mappingRole = { 'copy': ["Id"] };
var mapping = {
'Roles': {
create: function (opts) {
return ko.mapping.fromJS(opts.data, mappingRole);
}
}
};
然后我原来的映射可能是这样的:
ko.mapping.fromJS(data, mapping);
并且似乎工作正常,不确定性能,但对我来说更重要的是不必手动定义后代视图模型。