Как передать свойство валидатора в h: inputText из составного компонента JSF2? - PullRequest
2 голосов
/ 24 февраля 2012

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

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

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

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

1 Ответ

0 голосов
/ 06 марта 2012

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

Сначала я определил компонент с именем 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="..."/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...