#primefaces #jsf-2 #mojarra
#первичные области #jsf-2 #mojarra
Вопрос:
Я использую простые интерфейсы <p:tabMenu>
вместе с входными компонентами с проверкой. Всякий раз, когда происходит сбой проверки для таких входных компонентов, переключение табуляции невозможно (что является предполагаемым поведением). Однако, когда я изменяю входные данные, которые вызвали сбой проверки, последующий AJAX-запрос приводит к изменению активной вкладки.
Мне удалось воспроизвести поведение в очень простом примере:
<f:metadata>
<f:viewParam name="tab" value="#{bean.activeTab}" />
</f:metadata>
<h:form id="theForm">
<p:tabMenu id="menu" activeIndex="#{bean.activeTab}">
<p:menuitem id="tab0" update="menu content" value="Tab 0">
<f:param name="tab" value="0"/>
</p:menuitem>
<p:menuitem id="tab1" update="menu content" value="Tab 1">
<f:param name="tab" value="1"/>
</p:menuitem>
</p:tabMenu>
<h:panelGroup id="content">
<p>Active Tab: #{bean.activeTab}<br/></p>
<h:inputText id="someInput" value="#{bean.someInput}" required="true">
<p:ajax update="menu content"/>
</h:inputText>
<p:message id="m_someInput" for="someInput"/>
</h:panelGroup>
</h:form>
Вспомогательный компонент для представления является @ViewScoped
и содержит только методы получения и настройки для следующих свойств:
private String someInput = null;
private Integer activeTab = 0;
Запустите пример, попробуйте переключиться на «Вкладку 1», которая завершается неудачей из-за пустого someInput
поля и показывает сбой проверки. Введите некоторый текст в поле ввода и щелкните за пределами ввода, чтобы вызвать событие изменения и запрос AJAX. Теперь вторая вкладка («Вкладка 1») становится активной! Почему? Это ошибка в PrimeFaces или я делаю что-то не так?
Моя среда:
- Простые интерфейсы 7.0 / 8.0
- JSF 2.2.15 / 2.3.17 (Mojarra)
- Wildfly 10.1.0.Final/26.0.1.Final
Обновить
- Я создал проблему на github
# 4471с проектом reproducer, который сейчас закрыт. - Проблема существует только с Mojarra, даже с 2.3.17. MyFaces, похоже, работает так, как ожидалось.
- Реальная причина, вероятно, в проблеме # 4562 Mojarra.
Обходной путь
Обходной путь, который может быть или не быть подходящим, в зависимости от ваших реальных потребностей, заключается в том, чтобы превратить AJAX-запрос с переключением табуляции в POST-запрос, отличный от AJAX, путем добавления ajax="false"
к <p:menuItem>
тегам.
Комментарии:
1. Добавляет ли
resetValues="true"
вp:ajax
справку?2. Нет, добавление
resetValues="true"
здесь не имеет никакого эффекта.