0

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

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

}

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

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

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

最后的验证将在 hasMemo 和 showOnlyMemo 上完成,并将用于 questions 对象上的 memo 值。

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

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

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

4

1 回答 1

1

首先,我同意托马拉克的观点。与其发布一堆你的代码“看起来像”的废话,你应该发布一些可读的实际代码。例如,我不知道你是否使用了任何observable,computedobservableArray成员,所以我只需要假设一切都是observableorobservableArray并且没有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();
    } } });

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

于 2013-08-30T22:16:50.300 回答