2013-06-26 3 views
7

나는 Durandal을 사용 중이며, 이는 Knockout을 활용합니다.넉 아웃 유효성 확인 : 동적 제약

내가 변경 검증 할 수 있도록하려면이

Fiddle

바이올린 내 "작업"솔루션보다 약간 다른 행동을 할 것으로 보인다

enter image description here 동적 길이,하지만 아직하고 있지 내가 원하는/기대하고있는 것.

뷰 모델 JS :

[시도 1] 일어나는 것으로 보인다 무엇

define(function() { 

    var self = this; 

    self.userInfo = {  
     IdOrPassportNumber: ko.observable().extend({ 
      required: true, 
      pattern: { 
       message: 'A message', 
       params: /some regex/ 
      } 
     }), 
     IdType: ko.observable() 
    }, 

    self.isIdValid = ko.validatedObservable({ 
     IdOrPassportNumber: self.userInfo.IdOrPassportNumber 
    }); 

    self.userInfo.IdOrPassportNumber.subscribe(function (value) { 
      if (isIdValid.isValid()) { 
       console.log('YOLO!'); 
      } 
    }); 

    self.userInfo.IdType.subscribe(function (value) { 
     console.log(value); 
     if (value === 'Passport') { 
      self.userInfo.IdOrPassportNumber.extend({ maxLength: 15 }); 
     } else { 
      self.userInfo.IdOrPassportNumber.extend({ maxLength: 13 }); 
     } 
    });  

    var viewModel = { 
     userInfo: self.userInfo 
    }; 

    viewModel["errors"] = ko.validation.group(viewModel.userInfo); 
    viewModel["errors"].showAllMessages(); 

    return viewModel; 
}); 

내가 입력을 시작할 때 13의 최대 & 분 유효성을 얻을 있지만 만약 15에 대한 유효성 검사 변경을 계속 입력합니다.초기 관찰 가능 확장 EG의 최대 길이를 정규식 바로 다음에 설정하고 관찰 가능을 사용하도록 최소 및 최대 길이를 설정하는 다른 경로를 시도했습니다. 성공.

I는 custom validation 특징을 살린,보다 구체적으로는 늘 다시 사용이 아니라 single use custom validation :

는 [시도 2] 여기

self.userInfo = {  
     IdOrPassportNumber: ko.observable().extend({    
      maxLength: self.maxLength(), 
      minlength: self.maxLength() 
     }), 
     IdType: ko.observable() 
    }, 

    self.maxLength = ko.observable(); 

    self.userInfo.IdType.subscribe(function (value) { 

      if (value === 'Passport') { 
      self.maxLength(15) 
      } else { 
       self.maxLength(3) 
      } 
    }); 
+2

는 당신이 http://cdnjs.com/을 사용할 수 (즉, 어떻게 계산 있기 때문에 여기가의 함수로 countryCode()를 호출해도 괜찮은지 일) 장소에서 계산 된 관찰을 정의 할 수 있습니다 녹아웃 유효성 검사 플러그인을 잡아 ... – nemesv

+1

완료. +1 Ps 아주 멋진 사이트. 확실히 북마크 됨 : –

답변

3

너무 가까이 :-) unwrap 값이 아닌 observable 자체를 제공해야합니다. 따라서 maxLength()에서 ()을 제거하면 유효성 검사 라이브러리가 자동으로 포장을 해제합니다.

self.userInfo = {  
    IdOrPassportNumber: ko.observable().extend({    
     maxLength: self.maxLength, 
     minlength: self.maxLength 
    }), 
    IdType: ko.observable() 
}, 

여기에 동적 정규식 패턴이있는 또 다른 예가 있습니다.

zipPostalPattern = ko.pureComputed(() => this.countryCode() === 'US' ? '^\\d{5}(?:[-\\s]\\d{4})?$' : ''); 
    zipOrPostal: KnockoutObservable<string> = ko.observable('').extend(
    { 
     required: true, 
     pattern: { 
      message: 'This is not a valid postcode for the country', 
      params: this.zipPostalPattern 
     } 
    }); 

또는 (메시지를 원하지 않는 경우).

zipPostalPattern = ko.pureComputed(function() { return this.countryCode() === 'US' ? '^\\d{5}(?:[-\\s]\\d{4})?$' : ''}); 
    zipOrPostal: KnockoutObservable<string> = ko.observable('').extend(
    { 
     required: true, 
     pattern: self.zipPostalPattern 
    }); 

중요 : 그냥 message 매개 변수를 제거하고 작동하지 않기 때문에 pattern = { params: this.zipPostalPattern }을 두지 않는 사용자 정의 메시지를 원하지 않는 경우. 메시지가 없으면 pattern 매개 변수에 대해 Regex/문자열을 직접 설정해야합니다.

또는 물론 당신은

zipOrPostal: KnockoutObservable<string> = ko.observable('').extend(
    { 
     required: true, 
     pattern: ko.pureComputed(function() { 
        return self.countryCode() === 'US' ? '^\\d{5}(?:[-\\s]\\d{4})?$' : '' 
        }) 
    }); 
+2

이것을 읽는 다른 사용자에게. 나는이 단계에서이 정확한 상황에 대해 이것을 테스트 할 수 없다. (더 이상이 프로젝트에서). 나는 받아 들인 해결책으로 @ Simon_Weaver의 해결책을 선호하고, 그런 것으로 그것을 표시 할 것이다. –

+1

감사합니다. 오늘 관측 대상을 규칙에 대한 매개 변수로 전달할 수 있을지도 모른다고 말해야 만합니다. 매우 흥분했습니다. 아마도 작동하지 않을 수도 있다는 것을 깨달았지만 다시 흥분한 것 같습니다. 아주 잘 작동합니다 :-) 내가 기억하는 바에 따르면 명확하게 문서화되지는 않았지만 이미 Knockout을 사용하는 방법을 알고 쉽게 유연성을 추가하면 매우 쉽습니다. –

6

날 일의 해결책 다른 곳에서.

[시도 3

self.userInfo = {  
     IdOrPassportNumber: ko.observable().extend({ 
      required: true, 
      pattern: { 
       message: 'A message', 
       params: /some regex/ 
      }, 
      validation: { 
       validator: function (val) { 
        if (self.userInfo.IdType() === 'Id') { 
         return val.length === 13; 
        } else { 
         return val.length === 15; 
        } 
       }, 
       message: function() { 
        if (self.userInfo.IdType() === 'Id') { 
        return 'Required: 13 characters'; 
        } else { 
        return 'Required: 15 characters'; 
        } 
       } 
      } 
     }) 
    } 
+3

부수적으로. 유효성 검사의 순서도 중요한 것으로 나타 났으므로 그 문제에 대한 사용자 정의 유효성 검사기 (또는 기타)를 먼저 트리거하고 이에 따라 주문하십시오. –

+0

고정 된 유효성 검사 및 바인딩을 사용하여 두 개의 다른 필드를 사용하는 것이 낫지 않습니까? ID = "ID"? id : password "/>'? 저장시'var idOrPassword = id() || password()'라고 써주십시오. – blazkovicz

4

SouthAfricanIDNumber는 정규식을 사용하는 사용자 검증이이

self.iDNumber = ko.observable('').extend({ 
     required: { 
      params: true, 
      message: 'ID Number is a required field.', 
      insertMessages: false 
     }, 
     SouthAfricanIDNumber: { 
      message: 'Please enter a valid South African ID number.', 
      onlyIf: function() { 
       return self.identityType() === 'SAID'; 
      } 
     } 
    }); 

고려한다.

+1

SO에 오신 것을 환영합니다. :) 그러나 내 받아 들여진 대답을보십시오. (나는 더 이상 프로젝트에 참여하지 않지만, 미래를 염두에 두겠다.) –

+1

첫 번째 게시물에서 'spacerogue'를 장려하기 위해 +1. – hirikarate