Как разрешить валидацию зависеть от нажатой кнопки?
Я создал форму и хочу показать предыдущие существующие элементы в таблице во время создания новой. Я хотел бы показать соответствующие элементы по мере заполнения формы. Но когда я пытаюсь отфильтровать список, не заполнив форму, появляются сообщения проверки, и таблица не обновляется.
Не знаю, возможно ли это, но что я хочу сделать что-то вроде этого:
<h:form id="form">
<h:outputText value="Name: "/>
<p:inputText value="#{itemsBean.name}" id="name" required="true"/>
<br/>
<h:outputText value="Description: "/>
<p:inputText value="#{itemsBean.description}" id="description" required="true"/>
<p:commandButton value="Save" update="form" actionListener="#{itemsBean.save}"/> //validate and save
<p:commandButton value="Filter" update="form" actionListener="#{itemsBean.updateItemsList}"/> //don't validate, and update the table.
<p:dataTable id="list" value="#{itemsBean.itemsList}" var="item">
<p:column>
<h:outputText value="#{item.name}"/>
</p:column>
<p:column>
<h:outputText value="#{item.description}"/>
</p:column>
</p:dataTable>
</h:form>
Я очень новичок в JSF.
4 ответа
Я понимаю, что вы хотите фильтровать на основе name
поле ввода. <p:commandButton>
по умолчанию отправляет запрос ajax и имеет process
атрибут, в котором вы можете указать, какие компоненты вы хотите обработать во время отправки. В вашем конкретном случае вы должны обработать только name
поле ввода и текущая кнопка (чтобы ее действие вызывалось).
<p:commandButton process="@this name" ... />
process
атрибут может принимать разделенную пробелами коллекцию (относительных) клиентских идентификаторов компонентов, где @this
относится к текущему компоненту. По умолчанию в случае <p:commandButton>
в @form
(который охватывает все поля ввода текущей формы и нажатой кнопки), поэтому все они были проверены в вашей первоначальной попытке. В приведенном выше примере все остальные поля ввода не будут обработаны (и, следовательно, также не проверены).
Однако если вы намерены пропустить required
проверка всех полей всякий раз, когда нажимается соответствующая кнопка, так что вы можете в конечном итоге обработать несколько полей, которые не обязательно должны быть заполнены, тогда вам нужно сделать required="true"
вместо этого условие, которое проверяет, нажата ли кнопка или нет. Например, пусть он оценивает true
только когда нажата кнопка сохранения:
<p:inputText ... required="#{not empty param[save.clientId]}" />
...
<p:inputText ... required="#{not empty param[save.clientId]}" />
...
<p:commandButton binding="#{save}" value="Save" ... />
Таким образом, он не будет проверен как required="true"
когда нажата другая кнопка. Хитрость в приведенном выше примере заключается в том, что имя нажатой кнопки (которая, по сути, является идентификатором клиента) было отправлено в качестве параметра запроса, и вы можете просто проверить его наличие в карте параметров запроса.
Смотрите также:
Я проверил это с не-AJAX представления:
<p:inputText ... required="#{not empty param.includeInSave1}" />
...
<p:inputText ... required="true" />
...
<p:commandButton value="Save1" ajax="false">
<f:param name="includeInSave1" value="true" />
</p:commandButton>
<p:commandButton value="Save2" ajax="false" />
Первый ввод требуется проверено только при нажатии кнопки Сохранить1.
В дополнение к ответу BalusC (очень полезный и полный) я хочу добавить, что когда вы используете <h:commandButton />
он будет проверять (обязательно, пользовательские проверки) все поля в <h:form />
где расположена командная кнопка, поэтому, когда вам нужно использовать более одной командной кнопки, вы можете подумать, что это хорошая практика использовать разные <h:form />
выполнять различные обязанности, чтобы избежать неожиданного поведения при отправке действий с помощью кнопок команд. Это хорошо объясняется в ответе BalusC: множественная h: форма на странице JSF
Если ваша форма имеет проверки и вы не обновляете <h:form />
или вы не показываете сообщения, вы можете получить головную боль, думая, что <h:commandButton />
не запускает ваше действие, но, скорее всего, это проблема проверки, которая не была показана.
Измените кнопку команды фильтра следующим образом, чтобы игнорировать проверку:
<p:commandButton value="Filter" update="list" actionListener="#{itemsBean.updateItemsList}" process="@this"/>
РЕДАКТИРОВАТЬ:
Соответствующий пост на SO, я думаю, что это решит и вашу проблему