2013-02-12 33 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