Knockout.js 在options.data为null的情况下,在knockout.mapping的更新回调中应该做什么?
这比问题更进一步 我有一个具有可为空的子属性的视图模型,就像前面提到的问题一样Knockout.js 在options.data为null的情况下,在knockout.mapping的更新回调中应该做什么?,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,这比问题更进一步 我有一个具有可为空的子属性的视图模型,就像前面提到的问题一样 var data = [{ id: 0, child: { prop1 : 'a', prop2 : 'b' } } //Child object has data ,{ id: 0, child: null } ]; // Child object is null 现在我想使用mapping插件的更新回调,如下所示: var mappingOptions = { c
var data = [{ id: 0, child: { prop1 : 'a', prop2 : 'b' } } //Child object has data
,{ id: 0, child: null } ]; // Child object is null
现在我想使用mapping插件的更新回调,如下所示:
var mappingOptions = {
child: {
create: function(options) {
if (!options.data)
return null;
return ko.mapping.fromJS(options.data);
},
update: function(options) {
if (!options.data)
return null;
// some update logic...
return options.target; // this is also null in case options.data is null
}
}
}
...
if (hasUpdateCallback() && mappedRootObject) {
mappedRootObject(updateCallback(mappedRootObject));
}
...
现在,当options.data为null时,我在控制台中得到一个错误“UncaughtTypeError:object不是函数”,指向映射插件中的以下代码:
...
if (hasUpdateCallback()) {
mappedRootObject(updateCallback(mappedRootObject));
}
...
其中mappedRootObject未定义
那么,如果options.data为null,我应该从更新回调返回什么呢
首先,您从未在模型上运行过ko.applyBindings 其次,您认为viewmodel对象不是一个函数…也不是真正必要的 新小提琴: 您的“child”对象不包含child的数据,因为child不包含子对象本身,所以您需要为您的“id”对象进行更新
update: function(options) {
console.log(options);
return options.data;
},
'child': {
create: function(options) {
if (!options.data)
return null;
return ko.mapping.fromJS(options.data);
}
}
好吧,如果其他人也会面临同样的问题,我刚刚更新了ko.mapping插件javascript,如下所示:
var mappingOptions = {
child: {
create: function(options) {
if (!options.data)
return null;
return ko.mapping.fromJS(options.data);
},
update: function(options) {
if (!options.data)
return null;
// some update logic...
return options.target; // this is also null in case options.data is null
}
}
}
...
if (hasUpdateCallback() && mappedRootObject) {
mappedRootObject(updateCallback(mappedRootObject));
}
...
所以,我在更新mappedRootObject之前检查它是否存在。虽然它工作得很好,但我已经找到了一种方法,如何在我的项目中根本避免更新回调,所以很遗憾,这个修复对我来说毫无用处。感谢您的回复!我的演示中没有标记,因此没有要绑定的内容。至于视图模型,它可以是任何对象,对吗。你的演示没有包含更新-我已经更改了它,出现了相同的错误。使用新的Fiddle更新了答案我需要为每个子对象运行更新回调,这就是为什么我将它放在“child”映射下。在更新的答案中,对主对象运行更新回调,这使得处理“子”对象非常困难-我必须手动检查所有子对象,使用键回调(示例中未指定,但在我的项目中使用)在现有视图模型(正在更新)中查找它们的对-这就是我使用ko.mapping的原因,所以它可以为我做所有这些。更具体地说你的“键回调”&&“更新回调”。你是说订阅每个“id”对象的“child”对象吗?