2015-01-30 4 views
0

Я разрабатываю составной компонент с помощью валидатора по умолчанию, который может использоваться вместе с более ограничительным пользовательским валидатором. Однако это не сработало.Переопределить валидатор ввода по умолчанию в составном компоненте

я сводился проблема, как показано ниже:

<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

, тогда почему бы вам просто не сделать 'maximum =" # {bean.maxLength} "' вместе с методом, возвращающим 'Math.Min (10, customLimit);'? – 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> 

поэтому, если no validateLength не указана, ваш 10 должен применяться, иначе другое значение, если оно более ограничительное.

Я думаю, что по дизайну вы можете использовать только один валидатор для определенного типа проверки. Таким образом, чтобы преодолеть эту проблему, у вас есть 3 варианта:

Во-первых, вы могли бы использовать регулярное выражение валидатора внутри компонента, как:

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

Это позволит пользователю компонент применить его собственный f:validateLength. Но тогда из. он больше не сможет применять свои собственные f:validateRegex.

Другим вариантом было бы, чтобы пользователь компонента смог отключить проверку встроенного компонента с помощью атрибута компонента. Но это, однако, полностью обходит ваше ограничение длины 10, если пользователь решит его отключить.

Лучшим вариантом (imho) было бы применить maxLength как собственный атрибут и подтвердить эту опцию против вашего ограничения макс. 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> 

Использование теперь будет:

<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> 

Это также имеет преимущество, что пользователь компонента не должен знать о фактическом имени инкапсулированным editableValueHolder для того, чтобы применить f:validateLength.

Также подумайте, если это действительно позволяет ограничить максимальную длину внутри вашего компонента. Компоненты должны иметь возможность работать для любого прецедента по разработанному типу данных, если только они не контролируют появление компонента, например, количество столбцов, элементов на страницу и т.п.

+0

Сначала я использовал подход пользовательских атрибутов, но мне это не понравилось. Спасибо, что подтвердили это как разумное решение. –

Смежные вопросы