2013-07-31 41 views
0

嗨我需要創建一個自定義驗證程序,將使用基因敲除驗證插件的可觀察數組的每個元素aplyed。我對象的結構將是這個樣子,當我把它上傳到服務器:淘汰賽驗證多個級別深觀察數組

var viewModel = { 
    evaluationFormDataContract: { 
     studentAssignmentInstanceId: value, 
     evaluationType: value, 
     categories: array[ 
     CategoriesOnEvaluationDataContract1 = { 
      memo: value, 
      categoryId: value, 
      title: value, 
      // Fields needed for validation 
      hasMemo: value, 
      memoIsMandatory: value 
      questions: array[ 
      QuestionsOnEvalCategoryDataContract1 = { 
       memo: value, 
       grade: value, 
       hasGrade: value, 
       hasMemo: value, 
       showOnlyMemo: value 
      }, 
      QuestionsOnEvalCategoryDataContract2 = { 
       memo: value, 
       grade: value, 
       hasGrade: value, 
       hasMemo: value, 
       showOnlyMemo: value 
      }] 
     }, 
     CategoriesOnEvaluationDataContract2 = { 
      memo: value, 
      categoryId: value, 
      title: value, 
      // Fields needed for validation 
      hasMemo: value, 
      memoIsMandatory: value 
      questions: array[ 
      QuestionsOnEvalCategoryDataContract1 = { 
       memo: value, 
       grade: value, 
       hasGrade: value, 
       hasMemo: value, 
       showOnlyMemo: value 
      }, 
      QuestionsOnEvalCategoryDataContract2 = { 
       memo: value, 
       grade: value, 
       hasGrade: value, 
       hasMemo: value, 
       showOnlyMemo: value 
      }, 
      QuestionsOnEvalCategoryDataContract3 = { 
       memo: value, 
       grade: value, 
       hasGrade: value, 
       hasMemo: value, 
       showOnlyMemo: value 
      }] 
     }, ] 
    } 

}

現在確認將必須在兩個嵌套數組只applyed,將根據完成一些屬性。

第一個驗證必須在類別數組的每個對象上完成,它將檢查hasMemo和memoIsMandatory是否需要這種情況。

第二個驗證將在每個問題數組的對象上完成,並且它將檢查hasGrade是否需要等級。

最後的驗證將在hasMemo和showOnlyMemo上完成,並將用於問題對象的備忘錄值。

閱讀該文檔的驗證插件,我發現我怎麼會擴展簡單觀察的.Witch似乎做這樣的事:

ko.validation.rules['mustEqual'] = { 
    validator: function (val, otherVal) { 
     return val === otherVal; 
    }, 
    message: 'The field must equal {0}' 
}; 

但我不認爲這會爲結構工作我的viwmodel.How我可以爲我的observableArrays中的每個observable創建驗證器?

+2

您問題中的示例對象在語法上不是有效的。請張貼實際的代碼。讓你的開發夥伴*猜測*你正在使用的東西是非常適得其反的。 – Tomalak

回答

1

首先,我同意Tomalak。你應該發佈一些可讀的實際代碼,而不是發表一些你的代碼「看起來像」的廢話。例如,我不知道你是否使用任何observable,computedobservableArray成員,所以我只需要假設一切都是observableobservableArray,並且沒有computed成員。現在

,你說:

首先確認不得不類別陣列的每個對象上完成,它會檢查是否hasMemo和memoIsMandatory如果是這種情況備忘錄將需要。

讓我只是說,命名屬性hasMemo,這意味着memo字段是必需的是可怕的!如果你打電話hasMemo,這應該意味着的問題有一個備忘錄。您爲什麼需要查看hasMemomemoIsMandatory以查看是否需要memo?同上hasGrade

無論如何,您需要的僅僅是在您的課程上爲每個observables添加驗證。等等,那是另一個假設。你正在使用類,對嗎?你不只是創建一個單獨的對象,並且不使用構造函數給它一堆嵌套的數組和對象,對嗎?那麼我會繼續假設你正在創建構造函數並將其留在那裏。

我只關注你的第一個驗證,因爲第二個就像它,第三個對我來說是無法理解的。所以我們可以說你的「CategoriesOnEvaluationDataContract1」對象使用了下面的構造:

function Category() { 
    var self = this; 
    self.categoryId = ko.observable(); 
    self.hasMemo = ko.observable(); 
    self.memoIsMandatory = ko.observable(); 
    self.memo = ko.observable(); 
    //etc etc... 
} 

你需要用驗證擴展memo,你想要的需要驗證這種情況。這看起來像這樣:

self.memo = ko.observable().extend({ required: true }); 

這使得它總是需要memo。但那不是你想要的,當你想要hasMemomemoIsMandatory都是真實的時候它是必需的,對嗎?所以這是你需要做的:

self.memo = ko.observable().extend({ required: { onlyIf: function() { 
     return self.hasMemo() && self.memoIsMandatory(); 
    } } }); 

那裏。這裏的所有都是它的。你應該能夠弄清楚其餘的。如果沒有,請讓我知道。 :)