2015-01-30 6 views
0

보다 제한적인 사용자 지정 유효성 검사기와 함께 사용할 수있는 기본 유효성 검사기를 사용하여 복합 구성 요소를 개발 중입니다. 그러나 의도적으로 작동하지 않았습니다.컴포지트 구성 요소의 입력의 기본 유효성 검사기를 재정의하십시오.

는 I는 다음 문제로 요약 :

<h:inputText id="textId" value="#{bean.text}"> 
    <f:validateLength for="textId" maximum="10" /> 
    <f:validateLength for="textId" maximum="5" /> 
</h:inputText> 

maximum=5 대한 검증이 실행되지 않거나 결과가 생략한다 적절한 피드백만을 maximum=10 룰 결과

Text field: 1234567890123

searchForm:textId: Validation Error: Length is greater than allowable maximum of '10'

Text field: 1234567

passes

이 문제의 원인은 무엇입니까? 어쨌든 나의 요구 사항을 어떻게 달성 할 수 있습니까?

귀하의 코멘트에서
+0

이 실험이 필요한 이유는 무엇입니까 (단 하나만 명백하게 간주됩니까)? 예상치 못한 행동이라고하셨습니까? 그렇다면 귀하의 관점에서 기대되는 행동은 무엇입니까? (''의'for' 속성은 중복되고 전혀 필요하지 않습니다.) – Tiny

+0

하나의 유효성 검사기가 실패하면 최종 유효성 검사 결과가 부정적 일 것으로 예상됩니다. 다음을 구현하려고합니다. 복합 컴포넌트를 사용하는 페이지에서보다 제한적인 맞춤 유효성 검사기와 함께 사용할 수있는 복합 컴포넌트의 기본 유효성 검사기. –

+0

그런 다음,'Math.Min (10, customLimit);을 리턴하는 메소드와 함께'max = "# {bean.maxLength}"'를 왜 간단히하지 않습니까? – dognose

답변

1

, 나는 가정이 같은 구성 요소가 있습니다

<cc:interface > 
    <cc:editableValueHolder name="text" targets="myText" /> 
</cc:interface> 
<cc:implementation> 
    <h:inputText id="myText"> 
     <f:validateLength maximum="10" /> 
    </h:inputText> 
</cc:implementation> 

을 그리고 당신은 그것을 사용하고자하는 - 가정의 myInput라고 -이 같은 :

<ns:myInput> 
    <f:validateLength maximum="5" for="text" /> 
</ns:myInput> 

따라서, 경우 validateLength가 주어지지 않으면, 더 제한적인 경우 10이 적용되어야하며, 다른 값은 적용되어야합니다.

나는 특정 유효성 검사 유형에 대해 하나의 유효성 검사기 만 사용할 수 있다고 생각합니다.

첫째,이 같은 구성 요소 내에서 정규식 유효성 검사기를 사용할 수 있습니다 :

<h:inputText id="myText"> 
     <f:validateRegex pattern=".{,10}" /> 
    </h:inputText> 

이 구성 요소 사용자가 f:validateLength 자신을 적용 할 수 것이다 그래서이 문제를 극복하기 위해 당신은 3 가지 옵션이 있습니다. 하지만 그때. 그는 자신의 f:validateRegex을 더 이상 적용 할 수 없습니다.

또 다른 옵션은 구성 요소 사용자가 구성 요소 속성을 사용하여 빌드 유효성 검사를 비활성화 할 수있게하는 것입니다. 그러나 이것은 사용자가 길이를 줄이기로 결정한 경우에는 길이가 10이라고 가정합니다.

가장 좋은 옵션 (imho)은 maxLength를 자체 속성으로 적용하고 max.에 대한 해당 옵션의 유효성을 검사하는 것입니다. 10 자리 :

<cc:interface > 
    <cc:attribute name="maxLength" required="false" default="10"/> 
</cc:interface> 
<cc:implementation> 
    <h:inputText id="myText"> 
     <f:validateLength maximum="#{(cc.attrs.maxLength > 10)? 10 : cc.attrs.maxLength}" /> 
    </h:inputText> 
</cc:implementation> 

사용이 지금과 같다 : 구성 요소 사용자가를 적용하기 위해 encapsuled editableValueHolder의 실제 이름에 대해 알 필요가 없다는 것을이 또한 장점이있다

<ns:myInput maxLength="15"> 
    <!-- This will apply your contraint of 10 --> 
</ns:myInput> 

<ns:myInput maxLength="3"> 
    <!-- This will apply the component users constraint of 3 --> 
</ns:myInput> 

, f:validateLength.

또한 인 경우 실제로은 구성 요소 내부의 maxLength를 제한합니다. 구성 요소의 모양 (예 : 열 수, 페이지 당 항목 수 등)을 제어하지 않는 한 구성 요소는 설계된 데이터 유형의 모든 유스 케이스에 대해 작동 할 수 있어야합니다.

+0

처음에는 맞춤 속성 접근법을 사용했지만 마음에 들지 않았습니다. 합리적인 해결책으로 확인해 주셔서 감사합니다. –