knockout验证多级深度可观察数组

时间:2013-07-31 08:09:44

标签: javascript knockout.js knockout-validation

您好我需要使用knockout验证插件创建一个自定义验证器,该验证器将用于可观察数组的每个元素。当我将它发布到服务器时,我的对象的结构看起来像这样:

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
           }]
       }, ]
   }

}

现在验证必须仅应用于两个嵌套数组,并且将基于某些属性完成。

必须对categories数组的每个对象进行第一次验证,如果需要备忘录,它将检查hasMemo和memoIsMandatory。

将对问题数组的每个对象进行第二次验证,如果需要案例等级,它将检查是否为hasGrade。

最后一次验证将在hasMemo和showOnlyMemo上完成,并将用于问题对象上的备忘录值。

阅读验证插件的文档我发现如何扩展一个简单的observable .Witch它似乎是这样做的:

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

但我认为这不适用于我的viwmodel的结构。如何在observableArrays中为每个observable创建验证器?

1 个答案:

答案 0 :(得分:1)

首先,我同意Tomalak。你应该发布一些可读的实际代码,而不是发布你的代码“看起来像”的一堆废话。例如,我无法确定您是否使用了observablecomputedobservableArray成员,因此我必须假设所有内容都是observable或{{1并且没有observableArray个成员。

现在,你说:

  

必须对categories数组的每个对象进行第一次验证,如果需要备忘录,它将检查hasMemo和memoIsMandatory。

我只想说,命名一个属性computed,这意味着需要hasMemo字段是可怕的!如果你打电话memo,那就意味着问题有备忘录。为什么您需要同时查看hasMemohasMemo以查看是否需要memoIsMandatory?同上memo

无论如何,您只需要为类中的每个hasGrade添加验证。等等,这是另一个假设。你在上课,对吧?你不是只创建一个对象并给它一堆嵌套的数组和对象而不使用构造函数,你呢?好吧,我会继续假设您正在创建构造函数并将其留在那里。

我只关注你的第一次验证,因为第二次验证就像它,而第三次验证对我来说是难以理解的。因此,假设您的“CategoriesOnEvaluationDataContract1”对象使用以下构造函数:

observables

您需要使用验证程序扩展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 }); 。但这不是你想要的,你希望memohasMemo都是真的,对吗?所以这就是你需要做的事情:

memoIsMandatory

有。这里的所有都是它的。你应该能够弄清楚其余部分。如果没有,请告诉我。 :)