2013-06-28 15 views
0

我使用Knockout Validation在Durandal/KnockoutJS應用程序中驗證我的模型。它工作正常,但我碰到了一個我不確定如何處理的情況。用戶輸入的內容之一是「指導員」列表,他們可以輸入任意數量的指導員。每位教練都有一個「教學百分比」值。所有教學百分比的總和必須加起來爲100%。如何驗證多個模型對象中的一組數字是否合計爲指定值?

我不知道如何設置驗證了這一點,因爲當我定義「教官」我的模型對象,我不能引用其他導師的對象任意數量。

我已經能夠拿出最好的辦法是將計算觀察到一個視圖模型是所有教師的教學百分比之和,並驗證價值爲100

我缺少的東西?這是一個明智的方式去處理這種情況?一般來說,這個問題適用於任何你有多個模型對象的情況,並且它們的一個屬性的有效性相互依賴於其他對象的屬性。例如:

例如,ObjA.Heading是有效的,如果它是正數, ObjB.Heading也是正數;反之亦然(ObjB.Heading如果是正數,則爲有效, ObjA.Heading也爲正數)。

感謝如何處理這種情況的任何輸入。

謝謝!

+1

這就是我在第一次運行時的處理方式。如果你考慮顯示器,你可能會有一個「總計」行,這增加了一切。您將驗證計算的「總計」視圖模型,而不是其他視圖模型的集合。聽起來像是對我有效的方法! –

回答

0

最初回應的第一條評論,但我認爲它屬於更進了答案類別:

棘手的問題是如何的總和/總計算觀察到的都知道,孩子的視圖模型「教學百分比」值了其實改變了?每當指導者被添加/移除到列表時觸發計算是一回事,但修改現有指導者的值需要一些額外的工作。在這種情況下,我會建議您調查knockout-postbox。它是一個pub/sub類型的庫,您的主VM可以訂閱其他視圖模型observables中發生的更改。從那裏,你可以計算的基礎上更新這些變化

不知道到底你的ViewModels怎麼看,它的工作是這樣的:

// in instructor VM 
self.teachingPercentage= ko.observable(value).publishOn("teachingPercentageUpdated"); 

// in main VM 
self.teachingPercentageTotal = ko.computed(function() { 
    var total = 0; 
    ko.utils.arrayForEach(self.instructors(), function (i) { 
     total += i.teachingPercentage(); 
    }); 
    return total; 
}); 
self.teachingPercentageTotal.subscribeTo("teachingPercentageUpdated"); 
self.teachingPercentageTotal.extend({ equal: 100 }); 

我沒有真正運行這個問題,假設它的工作原理。這可能是一些更好的方式來做到這一點,但這是一般的想法。

+0

我認爲一個ko.computed()應該自動檢測一個依賴的可觀察性是否發生了變化,從而重新計算自身並通知訂戶新的值? – Josh

+0

你知道,你是對的。我曾將這種方法用於單獨的問題,並使用pub/sub實現來完成此操作,但在這種情況下,計算機可以執行此操作。在這裏使用計算的方法進行了實驗:http://jsfiddle.net/8UGLW/其中我使用pub/sub是需要驗證的多級子視圖模型,並且每次更改任何內容時都通過驗證分組重新運行矯枉過正。 –

相關問題