2013-07-31 3 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에서 수행되며 질문 객체의 메모 값으로 사용됩니다.

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

하지만이 구조를 위해 작동합니다 생각하지 않는다 : 나는 그것을 이런 식으로 뭔가를 할 것으로 보인다 간단한 관찰 .Witch을 연장 할 방법을 찾을 검증 플러그인의 설명서를 읽기

내 관찰 모델에있는 각 관측 대상에 대한 유효성 검사기를 어떻게 만들 수 있습니까?

+2

질문의 샘플 객체는 구문 적으로 유효하지 않습니다. 실제 코드를 게시하십시오. 동료 개발자를 추측하기 * 노력하고있는 것은 비생산적인 것입니다. – Tomalak

답변

1

먼저 Tomalak에 동의합니다. 코드가 "비슷하게 보일 것"이라는 말도 안되는 것을 게시하는 대신 실제 코드를 읽을 수 있도록 게시해야합니다. 예를 들어, observable, computed 또는 observableArray 회원을 사용하고 있는지 알 수 없으므로 모든 것이 observable 또는 observableArray이고 아무런 응답도 없다고 가정해야합니다. computed 회원이 있습니다.

첫 번째 검증이 카테고리 배열의 각 개체에서 수행되어야하며 hasMemo 및 memoIsMandatory는이 경우 메모가 필요합니다 경우 경우 확인합니다 :

지금, 당신은 말했다.

나를 보자는 속성 hasMemo 이름을 지정하고이 memo 필드가 필요하다는 것을 의미하는 것은 끔찍한 말! hasMemo을 호출하면 해당 질문에 에있는 메모에이있는 것입니다. 그리고 memo이 필요한지 확인하려면 왜 hasMemomemoIsMandatory을 모두 볼 필요가 있습니까? Dotto는 hasGrade입니다.

에 관계없이, 당신이 필요로 수업에 observables 각 유효성 검사를 추가하는 단지입니다. 잠깐, 그건 또 다른 가정입니다. 수업을 사용하고 있습니다. 당신은 하나의 객체를 생성하는 것이 아니라 생성자를 사용하지 않고 배열과 객체를 중첩시켜주는 것입니다. 자, 여러분이 생성자를 생성하고 있다고 가정하고 계속 진행할 것입니다. 두 번째는 그냥 세번째 같은 때문에 난 그냥 첫 번째 검증에 초점을 맞출 것이다

나에게 이해할 수없는 것입니다.그럼 당신의 "CategoriesOnEvaluationDataContract1"개체는 다음과 같은 생성자를 사용하는 가정 해 봅시다 : 당신은 당신이 필요한 검증을 원하는이 경우, 발리와 memo을 확장 할 필요가

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

. 그러면 다음과 같이 보입니다.

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

이렇게하면 memo이 항상 필요합니다. 그러나 그것은 당신이 원하는 것이 아니며, hasMemomemoIsMandatory이 모두 사실 일 때 필요하다고 생각하십니까? 그래서 이것은 당신이해야 할 일입니다 :

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

있습니다. 그게 전부입니다. 나머지는 알아낼 수 있어야합니다. 그리고 그렇지 않다면 알려주세요. :)