2014-02-06 17 views
0

这是比this问题更进一步的问题。如果options.data为null,你应该怎么做更新knockout.mapping的回调?

我有一个为空的子属性视图模型,就像之前提到的问题

var data = [{ id: 0, child: { prop1 : 'a', prop2 : 'b' } } //Child object has data 
      ,{ id: 0, child: null } ]; // Child object is null 

现在我想用映射插件的更新回调,而做到这一点,如下所示:

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 
     } 
    } 
} 

现在,当options.data为空时,在控制台“Uncaught TypeError:object is not a function”中出现错误,指向此映射插件中的代码:

...  
if (hasUpdateCallback()) { 
    mappedRootObject(updateCallback(mappedRootObject)); 
} 
... 

其中mappedRootObject未定义。

那么如果options.data为null,我应该从更新回调中返回什么?

JSFiddle Demo.

回答

0

嘛,万一别人也会面临同样的问题,我刚刚更新ko.mapping插件的JavaScript如下:

...  
if (hasUpdateCallback() && mappedRootObject) { 
    mappedRootObject(updateCallback(mappedRootObject)); 
} 
... 

所以,我更新前检查mappedRootObject的存在性。虽然它运行良好,但我发现了一种方法,即如何避免在我的项目中使用更新回调,因此,不幸的是,此修复对我来说毫无用处。

0

原因之一,你永远不跑你的模型ko.applyBindings。

http://jsfiddle.net/wEfWR/3/

ko.applyBindings(ko.mapping.fromJS(data)) 

其次,你的ViewModel对象不是一个函数......也不是真的有必要。

新小提琴: http://jsfiddle.net/wEfWR/5/

你的“孩子”对象不包含儿童不含孩子本身的数据,因此你需要更新你的“身份证”对象,而不是。

update: function(options) { 
    console.log(options); 
    return options.data; 
}, 
'child': { 
    create: function(options) { 
     if (!options.data) 
      return null; 
     return ko.mapping.fromJS(options.data); 
    } 
} 
+0

谢谢您的回复!我的演示中没有标记,因此没有任何绑定。至于视图模型 - 它可能是任何对象,对。你的演示不包括更新 - 我已经改变它http://jsfiddle.net/wEfWR/4/,同样的错误出现。 –

+0

用新的小提琴更新了答案 – beauXjames

+0

我需要为每个子对象运行更新回调,这就是为什么我将它放在“子”映射下的原因。在更新后的主对象回调更新回调函数中,这使得处理“子”对象非常困难 - 我必须手动检查所有子对象,使用关键回调在现有视图模型中找到它们的对(正在更新) (没有在样例中指定,但在我的项目中使用) - 这就是为什么我使用ko.mapping,所以它会为我做这一切。 –

相关问题