Как позволить проверке зависеть от нажатой кнопки? - PullRequest
34 голосов
/ 04 декабря 2011

Я создал форму и хочу показать предыдущие существующие элементы в таблице во время создания новой. Я хотел бы показать соответствующие элементы по мере заполнения формы. Но когда я пытаюсь отфильтровать список, не заполнив форму, появляются сообщения проверки, и таблица не обновляется.

Не знаю, возможно ли это, но что я хочу сделать примерно так:

<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 ]

61 голосов
/ 04 декабря 2011

Я понимаю, что вы хотите фильтровать на основе поля ввода name.<p:commandButton> отправляет по умолчанию ajax-запрос и имеет атрибут process, в котором вы можете указать, какие компоненты вы хотите обработать во время отправки.В вашем конкретном случае вы должны затем обработать только поле ввода name и текущую кнопку (чтобы было вызвано ее действие).

<p:commandButton process="@this name" ... />

Атрибут processможет принимать разделенную пробелами коллекцию (относительных) идентификаторов клиентов компонентов, где @this относится к текущему компоненту.По умолчанию используется значение от <p:commandButton> до @form (которое охватывает все поля ввода текущей формы и нажатой кнопки), поэтому все они были проверены в вашей первоначальной попытке.В приведенном выше примере все остальные поля ввода не будут обработаны (и, следовательно, также не проверены).

Если вы, однако, намереваетесь пропустить проверку required для всех полей всякий раз, когдасоответствующая кнопка была нажата, так что вы можете в конечном итоге обработать несколько полей, которые не обязательно должны быть заполнены all , тогда вам нужно сделать условное выражение 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" при нажатии другой кнопки.Хитрость в приведенном выше примере заключается в том, что имя нажатой кнопки (которая по сути является идентификатором клиента) было отправлено в качестве параметра запроса, и вы можете просто проверить его наличие в карте параметров запроса.

См. Также:

6 голосов
/ 01 марта 2015

В дополнение к ответу BalusC (очень полезному и полному) я хочу добавить, что при использовании <h:commandButton /> он будет проверять (обязательно, пользовательские проверки) все поля в <h:form />, где расположена командная кнопка, поэтому, когда вам нужно использовать более одной командной кнопки, вы можете подумать, что рекомендуется использовать разные <h:form /> для разных обязанностей, чтобы избежать непредвиденного поведения при отправке действий командных кнопок. Это хорошо объясняется в ответе BalusC: Множественная h: форма на странице JSF

Если в вашей форме есть проверки, и вы не обновляете <h:form /> или не показываете сообщения, у вас может возникнуть головная боль, когда вы думаете, что <h:commandButton /> не запускает ваше действие, но, скорее всего, это проблема проверки, которая не было показано.

6 голосов
/ 09 августа 2014

Я проверил это с не-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" />

Первый вход требуется проверен только при отправке кнопки Save1.

2 голосов
/ 04 декабря 2011

Измените кнопку команды фильтра следующим образом, чтобы игнорировать проверку:

<p:commandButton value="Filter" update="list" actionListener="#{itemsBean.updateItemsList}" process="@this"/>

РЕДАКТИРОВАТЬ:

Соответствующий пост на SO, я думаю, это тоже решит вашу проблему

JSF 2.0: как пропустить проверку бина JSR-303?

...