2012-02-24 4 views
2

У нас есть компонент ввода текста, созданный как компонент JSF 2, который инкапсулирует как метку, так и поле редактирования (h:inputText), а также заботится о макете. Наша проблема заключается в том, чтобы получить свойство validator для входного поля для отображения на нашем составном компоненте. У нас есть атрибут, объявленный в разделе cc: interface, но проблема с добавлением validator="#{validator}" при объявлении внутреннего h: inputText в реализации cc: заключается в том, что когда поле не используется, оно не работает во время выполнения.Как передать свойство validator в h: inputText из составного компонента JSF2?

Я хотел сделать это так же, как это делается для h: inputText, без необходимости регистрировать пользовательский валидатор.

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

Примечание: Я хочу использовать выражение привязки метода в свойстве validator моего составного компонента, так же как и оригинал h: inputText. Спасибо за помощь!

ответ

0

У меня было несколько компонентов с определенными масками, валидациями и преобразователями.

Во-первых, я определил компонент под названием «defaultText», как это:

</cc:interface> 
    <cc:attribute name="value"/> 
    <cc:editableValueHolder name="mycomp" targets="input"/> 
</cc:interface> 
<cc:implementation> 
    <p:inputMask id="input" value="#{cc.attrs.value}"/> 
</cc:implementation> 

(есть некоторые другие атрибуты, я выпускающие для экономии места). См. EditableValueHandler? где вы определяете, к какому компоненту вы привяжете свой конвертер/валидатор.

Таким образом, я использовал свой компонент 'defaultText' для создания других компонентов, например, 'text.xhtml':

</cc:interface> 
    <cc:attribute name="value"/> 
    <cc:attribute name="mask"/> 
    <cc:attribute name="jsfConverter"/> 
    <cc:attribute name="jsfValidator"/> 
</cc:interface> 
<cc:implementation> 
    <foo:defaultText id="dt" value="#{cc.attrs.value}" mask="#{cc.attrs.mask}"> 
     <c:if test="#{!empty cc.attrs.jsfConverter}"> 
      <f:converter converterId="#{cc.attrs.jsfConverter}" for="mycomp"/> 
     </c:if> 
     <c:if test="#{!empty cc.attrs.jsfValidator}"> 
      <f:validator validatorId="#{cc.attrs.jsfValidator}" for="mycomp"/> 
     </c:if> 
    </foo:defaultText> 
</cc:implementation> 

<composite:editableValueHolder> определить, что любой валидатор/преобразователь (<f:validator for="mycomp">) будет связан с <p:inputMask id="input"> ,

Затем я использую мой компонент текста на моих страницах:

<foo:text value="#{dummyMBean.text}" mask="99.999-99" jsfConverter="..." jsfValidator="..."/>