2013-11-28 2 views
3

Вот моя конфигурация:Как отключить требуемый тег на selectOneMenu, когда p: ajax event = change?

  • PrimeFaces: 4.0.4 (элита)
  • OmniFaces: 1.6.3
  • JSF: MyFaces 2.0.2
  • сервер: WebSphere 8.5.0.2

часть кода (я только вывесить соответствующую часть для большей ясности):

<p:selectOneMenu value="#{viewModel.selectedContact}" required="true" converter="omnifaces.SelectItemsConverter"> 
    <p:ajax event="change" listener="#{viewModel.updateContact}" update="area"/> 
    <f:selectItem itemValue="#{null}" itemLabel="#{msg.no_contact}" noSelectionOption="true" /> 
    <f:selectItems value="#{viewModel.contacts}"/> 
</p:selectOneMenu> 

Итак, у нас есть простой p:selectOneMenu, который содержит список объектов Contact, а также вариант «Без контакта». Это поле необходимо, если я хочу отправить форму.

Когда контакт выбран в списке, вызывается метод updateContact. Этот метод будет генерировать данные, которые будут отображаться в разделе area страницы, обновленной по вызову AJAX.

Если я выбираю опцию «Нет контакта», то возникает ошибка проверки, так как это поле не требуется, поэтому метод updateContact не вызывается. Я хотел бы, чтобы метод вызывался, поскольку мне нужно было бы сбросить некоторые данные, а затем скрыть раздел area страницы.

Я пробовал использовать process="@this", immediate="true", но он не работает. С immediate="true" выбранный Contact не передается методу updateContact.

Итак, что является лучшим способом обойти проверку этого поля при выборе нулевого значения?

ответ

7

Пусть атрибут required проверяет, нажата ли кнопка команды. Вы можете проверить это на наличие идентификатора клиента кнопки на карте параметров запроса.

<p:selectOneMenu ... required="#{not empty param[save.clientId]}" /> 
... 
<p:commandButton binding="#{save}" ... /> 

(примечание: код как есть, вам не нужно свойство компонента для этого)

Если кнопка команда не вызывается (но вместо изменения Аякса слушатель вызывается) , то атрибут required будет оценивать false, и все будет идти так, как вы намерены.


Update: согласно комментариям, вы намерены сделать их, как требуется во время визуализации ответ все время. Итак, добавьте эту проверку:

<p:selectOneMenu ... required="#{not empty param[save.clientId] or facesContext.currentPhaseId.ordinal eq 6}" /> 
... 
<p:commandButton binding="#{save}" ... /> 
+0

Что вы предлагаете, это хорошее решение. Однако у меня есть замечание. Все мои обязательные поля в форме имеют связанный 'p: outputLabel' с атрибутом' for'. Это означает, что рядом с ними будет отображаться небольшая звезда (*), показывая пользователю эти поля. Если я использую ваше решение, эти звезды больше не отображаются. Пользователь увидит их только после отправки формы. – Nasedo47

+0

См. Обновленный ответ. – BalusC

+0

Блестящий! Большое спасибо! Именно то, что мне нужно. – Nasedo47