Я использую валидатор OmniFaces' <o:validateAll> для проверки количества входных компонентов. Это прекрасно работает, пока я не помещаю его в RichFaces <rich:tabPanel>. Когда я делаю это и оставляю поля пустыми, проверка не выполняется (как и ожидалось), но активная вкладка изменяется независимо от неудачной проверки. Другие валидаторы, которые я пытался предотвратить, отключили tabPanel
от переключения на другую вкладку, всякий раз, когда проверка не выполняется.Почему <o: validateAll> ведет себя иначе, чем другие валидаторы?
В чем причина этого?
В настоящее время я использую OmniFaces 2.1 и RichFaces 4.5.17.Final с Mojarra 2.2.12 на Wildfly 9.0.2.
Вот XHTML-код, чтобы воспроизвести проблему:
<ui:composition xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:o="http://omnifaces.org/ui"
xmlns:rich="http://richfaces.org/rich">
<h:form id="form">
<rich:messages />
<rich:tabPanel id="tabPanel">
<rich:tab id="tab1" header="Tab 1">
<h:inputText id="myDouble" value="#{someDoubleVal}">
<f:validateDoubleRange minimum="1.0" maximum="2.0"/>
</h:inputText>
<o:validateAll id="allValid" components="myDouble" message="Missing value!" />
</rich:tab>
<rich:tab id="tab2" header="Tab 2">
Just another tab to switch.
</rich:tab>
</rich:tabPanel>
</h:form>
</ui:composition>
Введите значение вне 1.0 и 2.0 и попробуйте переключиться на вкладку 2, чтобы увидеть ожидаемое поведение, вызванное <f:validateDoubleRange>
: отображается лицо-сообщение и первая вкладка все еще активна.
Оставьте поле пустым и попробуйте переключиться на вкладку 2, чтобы увидеть поведение <o:validateAll>
: проверка достоверности не отображается (отображается сообщение лиц), но активирована вкладка 2.
Обновление: Описанное поведение применяется с switchType="ajax"
(по умолчанию), а также с switchType="server"
. В обоих случаях вкладка выполняет подачу включенных входов, поэтому с точки зрения пользователей переключатель табуляции, похоже, совпадает с <h:commandButton>
submit (технически могут быть различия, я не знаю, детали реализации вкладки).
Если я выполнить вкладки-переключатель с помощью обычной <h:commandButton>
с <f:setPropertyActionListener>
, то <o:validateAll>
ведет себя так же, как и другие валидаторы, то есть язычок-переключатель не выполняется из-за ошибки проверки.
<rich:tabPanel id="tabPanel" activeItem="#{bb.activeTab}">
...
<rich:tab id="tab1" name="tab1" header="Tab 1">
...
<h:commandButton value="submit">
<f:setPropertyActionListener value="tab2" target="#{bb.activeTab}" />
</h:commandButton>
...
</rich:tab>
</rich:tabPanel>
Примечание: Это просто минималистичный пример, показывающий поведение проблематичным. В моем реальном коде у меня есть не только один компонент, проверенный на <o:validateAll>
, и я действительно связываю входные значения с бэкэндом. Наблюдаемое поведение точно такое же.
Я только что понял, изменив положение тега '' в коде XHTML, изменит поведение! Поместите его перед компонентами, которые должны быть фактически проверены, и работает так, как ожидалось. Это желаемое поведение или ошибка в OmniFaces? В документации не упоминается этот эффект. Есть идеи? –
Не знаете, как богатые: tabPanel работает под обложками, но поведение упорядоченности описано в первом абзаце «общего использования» http://omnifaces.org/docs/javadoc/2.5/org/omnifaces/component/validator/ValidateMultipleFields. html – BalusC
Правильно, порядок заказа документирован. Но в нем также говорится: «Этот валидатор можно поместить в любом месте формы, но имейте в виду, что компоненты будут проверяться в порядке, как они появляются в форме.». Однако это не объясняет, почему валидация вызывает различное поведение внешней вкладки. Но, возможно, это особенность компонента RichFaces. У меня сложилось впечатление, что у RichFaces больше таких странностей. Может быть, я попробую пример с PrimeFaces и посмотрю, как это работает. –