Javascript 敲除验证多级深可观测阵列

Javascript 敲除验证多级深可观测阵列,javascript,knockout.js,knockout-validation,Javascript,Knockout.js,Knockout Validation,嗨,我需要创建一个自定义验证器,它将使用敲除验证插件应用于可观察数组的每个元素。当我将对象发布到服务器时,对象的结构将如下所示: var viewModel = { evaluationFormDataContract: { studentAssignmentInstanceId: value, evaluationType: value, categories: array[ CategoriesOnEvaluationDataCo

嗨,我需要创建一个自定义验证器,它将使用敲除验证插件应用于可观察数组的每个元素。当我将对象发布到服务器时,对象的结构将如下所示:

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

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

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

首先,我同意Tomalak的观点。您应该发布一些可读的实际代码,而不是发布一堆乱七八糟的代码“看起来像”。例如,我无法判断您是否正在使用任何
observable
computed
observableArray
成员,因此我只需假设所有内容都是
observable
observableArray
,并且没有
computed
成员

现在,你说:

必须对categories数组的每个对象进行第一次验证,它将检查是否需要hasMemo和memoIsMandatory(如果需要)

我只想说,命名一个属性
hasMemo
,这意味着
memo
字段是必需的,这太糟糕了!如果你把某个东西称为hasMemo,它应该意味着有问题的东西有一个memo。为什么您需要同时查看
hasMemo
memoismandatary
来确定是否需要
memo
?同样适用于
hasGrade

不管怎样,您需要的只是将验证添加到类上的每个
可观察对象中。等等,这是另一个假设。您正在使用类,对吗?您不只是创建一个对象,并在不使用构造函数的情况下为其提供一组嵌套数组和对象,是吗?好吧,我将继续假设您正在创建构造函数,并保持不变

我将只关注您的第一个验证,因为第二个验证与之类似,而第三个验证我无法理解。假设您的“CategoriesOnValuationDataContract1”对象使用以下构造函数:

function Category() {
    var self = this;
    self.categoryId = ko.observable();
    self.hasMemo = ko.observable();
    self.memoIsMandatory = ko.observable();
    self.memo = ko.observable();
    //etc etc...
}
您需要使用验证器扩展
memo
,在这种情况下,您需要所需的验证器。看起来是这样的:

ko.validation.rules['mustEqual'] = {
    validator: function (val, otherVal) {
        return val === otherVal;
    },
    message: 'The field must equal {0}'
};
    self.memo = ko.observable().extend({ required: true });
这使得始终需要
memo
。但这不是你想要的,当
hasMemo
memoismandatary
都是真的时,你希望它是必需的,对吧?。这就是你需要做的:

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

在那里。就这些。你应该能搞清剩下的。如果没有,请告诉我。:)

问题中的示例对象在语法上无效。请张贴实际代码。让您的开发伙伴猜测您正在使用的是什么,这会适得其反。