2013-02-12 46 views
0

尝试验证由validatedObservable对象集合组成的视图模型时,出现意外行为;实际上,嵌套集合。敲除验证:使用validatedObservables集合时出现意外行为

首先,让我指出你对我的jsfiddle演示行为:http://jsfiddle.net/cbono/ZTXB9/8/

我的视图模型是一个App对象。它包含一个单一的属性,服务,这是一个Service对象的集合。每个服务包含一个零售商您猜对的物品是Retailer物品的集合。每个对象都被实例化为一个validatedObservable,这样我就可以调用顶级对象上的isValid并查找子对象中的任何/所有错误。

当我初始化图书馆,我用:

ko.validation.init({ 
    grouping: { 
     deep: true, 
     observable: true 
    } 
}); 

唯一的验证规则我实际上是对零售商的对象。如果选择零售商且零售商的名称为“其他”((IsSelected() && IsOther()) === true),则需要属性OtherDesc属性。而已。否则,零售商是有效的。

当我测试规则时(选中其中一个“其他”复选框并将伴随的说明字段留空),验证将按预期失败。然而,视图模型的errors集合包含此:

[undefined, undefined, "This field is required"] 

此外,我得到的JS控制台上的错误时self.errors.showAllMessages()叫做:

Uncaught TypeError: Object function d(){if(0<arguments.length) 
     {if(!d.equalityComparer||!d.equalityComparer(c,arguments[0]))d.H(),c=arguments[0],d.G();return this}b.r.Wa(d);return c} 
     has no method 'isModified' 

我敢肯定,这两个问题是相关的,但是我一直无法将幕后发生的事情拼凑在一起。看起来好像当验证库走过对象图时,它正在抓住不是正确类型的对象(因此没有IsModified方法),因此在错误集合中放置了一堆未定义的

我没有按照预期使用库吗?我很努力地让这个工作,因为我真的很喜欢模型验证的想法。在jquery.validate之类的东西中重新创建这个验证会更加复杂。

回答

2

它看起来像validatedObservable的不能嵌套。仅将应用程序保留为validatedObservable可解决问题。

self.Services = ko.observableArray(
ko.utils.arrayMap(data, function (svc) { 
    return new Service(svc); // unwrap 
})); 

//.... 

self.Retailers = ko.observableArray(
ko.utils.arrayMap(data.retailers, function (rtl) { 
    return new Retailer(rtl); // unwrap 
})); 

http://jsfiddle.net/ostgals/ZTXB9/16/

+0

你知道,这让我疯狂当溶液就是这么简单。我希望文档更清楚地说明validatedObservable的正确用法。无论如何,它的效果很好 - 谢谢! – CBono 2013-02-12 19:46:33

+0

它们不能嵌套? – Edmondo1984 2013-03-21 12:24:57