Есть ли способ предотвратить отображение JSF предыдущего / устаревшего контента в h:selectManyMenu после ошибки проверки?
У меня есть форма с, скажем, текстовым полем и полем выбора.
<h:form id="form2">
<h:messages for="text3" />
<h:inputText id="text3" value="#{danielBean.text3}" required="true"/>
<br/>
<h:messages for="select1" />
<h:selectManyMenu id="select1" value="#{danielBean.selStrings}"
style="height:8em;" required="true"/>
<f:selectItems value="#{danielBean.allStrings}" var="_item" itemLabel="#{_item} (length #{_item.length()})" />
<br/>
<p:commandButton
value="Submit"
action="#{danielBean.save()}"
update=":form2"
>
</h:form>
При отправке обе проверяются, и, если проверка прошла успешно, соответствующие переменные в компоненте обновляются. Справедливо.
Проблема возникает, когда проверка (множественного выбора) НЕ удалась. У меня в Бобе есть (особенно для List<String>
s allStrings
а также selStrings
)...
@PostConstruct
public void init() {
text3 = "";
allStrings.clear();
allStrings.add("This");
allStrings.add("is");
allStrings.add("a");
allStrings.add("test");
selStrings.clear();
selStrings.add("a");
}
... так, чтобы у мультиселектора была одна предварительно выбранная опция. Если пользователь отменяет выбор этой опции (то есть не выбрал ни одной опции), проверка, конечно же, не удастся, будет отображено сообщение об ошибке...
... но мультиселект не будет пустым. Он покажет содержимое от bean-компонента, т. Е. Выбранное "a". Это сбивает с толку пользователя - появляется сообщение об ошибке "требуется ввод" и отображается заполненное поле.
Похоже, что это особенность жизненного цикла JSF, см. Эту статью BalusC:
"Когда JSF рендерит входные компоненты, он сначала проверит, является ли переданное значение ненулевым, а затем отобразит его, в противном случае, если локальное значение не равно нулю, а затем отобразит его, иначе будет отображено значение модели".
Это прекрасно работает для текстового поля text3
, потому что он представляет как пустую строку, а не ноль.
Проблема состоит в том, что нулевые выбранные опции из множественного выбора означают, что переданное значение равно нулю, что локальная копия (я полагаю, поскольку это первая отправка) равна нулю, так что отображается значение модели (выбрано "а"),
Я не хочу этого.
Как я могу заставить JSF использовать нулевое значение, которое было отправлено при визуализации ответа проверки?
заранее спасибо
Antares42
1 ответ
Для этого нет решения (кроме сообщения о проблеме ребятам из JSF и / или взлома исходного кода JSF). Однако есть обходной путь: обновляйте только те компоненты, которые действительно необходимо обновить при отправке. В настоящее время вы установили ajax для обновления всей формы. Как насчет обновления только сообщений?
<h:messages id="text3_m" for="text3" />
...
<h:messages id="select1_m" for="select1" />
...
<p:commandButton ... update="text3_m select1_m" />
При необходимости вы можете использовать селекторы PrimeFaces, чтобы минимизировать шаблон, если у вас достаточно много полей:
<h:messages for="text3" styleClass="messages" />
...
<h:messages for="select1" styleClass="messages" />
...
<p:commandButton ... update="@(.messages)" />