【发布时间】:2015-05-24 03:51:42
【问题描述】:
当我尝试使用敲除映射从空 json 属性映射到敲除可观察数组时遇到问题。映射完成后,剔除数组为空。
所以,例如,我有以下数据:
var data = { 'Name': 'David', 'Modules': null };
以及以下型号:
var ModuleViewModel = function(data) {
var self = this;
ko.mapping.fromJS(data, {}, self);
};
var Model = function(data) {
var self = this;
var mapping = {
'Modules': {
key: function(module) {
return ko.utils.unwrapObservable(module.Id);
},
create: function (options) {
return new ModuleViewModel(options.data);
}
}
};
ko.mapping.fromJS(data, mapping, self);
};
然后将其应用于视图:
var model = new Model(data);
ko.applyBindings(model);
在视图中,简单地说:
<span data-bind="text: Name"></span>
<span data-bind="text: Modules().length"></span>
我希望看到(以我的名字命名)的是已映射的模块数量。如果数据中存在模块:
var data = { 'Name': 'David', 'Modules': [ {'Id': '1', 'Name': 'Module1'} ] }
然后正确的数字会显示在视图上,但如果模块在数据中设置为 null,则该数字根本不会显示,因为它不知道映射到可观察数组。
另外,如果我在我的视图模型上定义一个额外的属性来映射到:
self.Modules = ko.observableArray;
这仍然没有像我预期的那样被映射,就好像你在映射之后查询 self.Modules() 一样,如果你查询一个普通的空可观察数组,你会得到 [] 返回时返回 null 值。
我在映射中做错了什么?我只想在模块数据为空时显示 0 值。
【问题讨论】:
-
您可以更改绑定。
<span data-bind="text: (Modules() || []).length"></span> -
你可以,但这并不能真正帮助他进行映射操作
-
当然,我只是想指出您不一定需要更改映射以使绑定正常工作。有时最好让您的绑定足够灵活以使用不同的映射。
-
当您使用映射插件时,您不能拥有
null或undefined值,该插件只有在键具有值时才能工作。如果你想正确使用它,你需要确保你确实有数据。 -
@JeffMercado Null 也是数据,属性值可以在有值和为空之间变化。这是糟糕的设计。
标签: javascript knockout.js knockout-mapping-plugin