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”对象吗?