在尝试验证由validatedObservable
个对象集合组成的视图模型时,我看到了意外行为;实际上,嵌套集合。
首先,让我指出我的JSFiddle,它演示了行为:http://jsfiddle.net/cbono/ZTXB9/8/
我的视图模型是App
对象。它包含一个属性服务,它是Service
个对象的集合。每个服务都包含零售商属性,您猜对了,该属性是Retailer
个对象的集合。每个对象都被实例化为validatedObservable,以便我可以在顶级对象上调用isValid
并查找子对象中的任何/所有错误。
当我启动库时,我使用:
ko.validation.init({
grouping: {
deep: true,
observable: true
}
});
我唯一有效的验证规则是Retailer对象。如果选择零售商且零售商的名称为“其他”((IsSelected() && IsOther()) === true
),则需要 OtherDesc 属性。而已。否则,零售商有效。
当我测试规则时(选中“其他”复选框之一并将附带的“说明”字段留空),验证将按预期失败。但是,视图模型的errors
集合包含:
[undefined, undefined, "This field is required"]
此外,在调用self.errors.showAllMessages()
时,我在JS控制台上收到此错误:
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
方法),从而放置一堆 undefined 在错误集合中。
我没有按预期使用图书馆吗?我正在努力让这个工作,因为我真的很喜欢模型验证的想法。在诸如jquery.validate之类的东西中重新创建这种验证将会复杂得多。
答案 0 :(得分:2)
看起来validatedObservable不能嵌套。只留下App作为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
}));