Введение: у меня есть 2 компонента p:calendar, у Calreq есть required = "true"
тогда как Calnotreq не является обязательным.
Код — xhtml-код p:calendar с вызовами ajax.
<p:outputLabel value = "Calendar Required" for = "calreq" />
<p:calendar label = "Calendar Required" id = "calreq"
required = "true"
inputStyle = "width: 100px;" showOn = "button"
value = "#{myBean.calReqObj}" >
<p:ajax event = "dateSelect" listener = "#{myAction.calReqChange()}"/>
<p:ajax event = "change" listener = "#{myAction.calReqChange()}"/>
</p:calendar>
<p:outputLabel value = "Calendar Not Required" for = "calnotreq" />
<p:calendar label = "Calendar Not Required" id = "calnotreq"
inputStyle = "width: 100px;" showOn = "button"
value = "#{myBean.calNotReqObj}" >
<p:ajax event = "dateSelect" listener = "#{myAction.calNotReqChange()}"/>
<p:ajax event = "change" listener = "#{myAction.calNotReqChange()}"/>
</p:calendar>
Реализации прослушивателя
//Invoked everytime **calreq** changes, except for null case
public void calReqChange() {
//myBeanObj
System.out.println("getCalReqObj from ajax event: " + myBeanObj.getCalReqObj() );
}
//Invoked everytime **calnotreq** changes, including for null case
public void calNotReqChange() {
//myBeanObj
System.out.println("getCalNotReqObj from ajax event: " + myBeanObj.getCalNotReqObj() );
}
Описание. Это часть большого куска кода, правильно упакованная внутри form/panel/panelgrid
. Оба вызова ajax calReqChange() & calNotReqChange()
вызываются при изменении значения даты либо из календаря, либо с клавиатуры.
Проблема: прослушиватель ajax в Calreq не вызывается ни в одном сценарии. Когда поле даты очищается/обнуляется, прослушиватели не вызываются и, соответственно, объект резервного компонента не обновляется до нуля. (Но вызываются прослушиватели Calnotreq)
В чем причина и как это решить?
Примечание-
immediate=true, process=@this, update=@this
.
Также попробовал f:ajax вместо p:ajax.p:calendar
символ звездочки (*) необходим в метке для внешнего вида. Так:
Это ожидаемое поведение. См. также пункт №3 на сайте stackoverflow.com/q/2118656. Почему именно вы хотите, чтобы методы действия вызывались при ошибке проверки? Похоже, что это не должны быть методы прослушивания ajax. Т.е. у вас проблема с XY. Вам нужно будет сделать шаг назад и подробно объяснить реальную проблему, для которой вы ошибочно полагали, что использование метода прослушивателя ajax будет правильным решением. Тогда мы сможем предложить правильное решение.
@BalusC- Требование состоит в том, что каждый раз при изменении p:calendar
значения серверная часть myBean.calReqOb
также должна немедленно обновляться (не дожидаясь отправки командной кнопки). Вот почему я включил слушателей. Внутри прослушивателей нет логики, но при вызове прослушивателя автоматически вызываются установщики объектов bean.
Дальше по требованию идёт ещё набор p:selectBooleanCheckbox & p:calendar id = "dependentCal"
. Когда флажок установлен, dependentCal
должен выбрать текущее значение из p:calendar id = "calreq"
. Вот почему я добавил прослушиватели ajax, поскольку они обновляются немедленно myBean.calReqObj
. Для простоты моего поста я не стал добавлять этот фрагмент кода.
Тогда это ваше решение: stackoverflow.com/q/14729982
@BalusC - я обновил последний раздел сообщения «Примечание». Символ звездочки (*) необходим для обязательного поля календаря. Могу ли я добавить звездочку (*) вручную? Я имею в виду, будут проверяться некоторые условия. Если это правда, то звездочка (*) должна появиться независимо от статуса required
p:calendar id = "calreq"
.
indicateRequired='#{myAction.displayAsterisk}'
. Если это сработает, то @BalusC, ваше решение должно идеально соответствовать моим требованиям.
Просто поставьте <p:outputLabel indicateRequired = "true">
да.
Судя по комментариям к вопросу, вам, похоже, нужна проверка, зависящая от действия. Таким образом, календарь следует проверять только по мере необходимости при вызове определенного действия, которое является действием основной командной кнопки, а не действием прослушивателя ajax.
Эту проблему можно решить в соответствии с рекомендациями, приведенными в соответствующем вопросе: Подтверждайте ввод по мере необходимости, только если нажата определенная командная кнопка.
<p:calendar ... required = "#{param.containsKey(mainCommandButton.clientId)}">
<p:ajax ... />
</p:calendar>
...
<p:commandButton binding = "#{mainCommandButton}" ... />
И чтобы сохранить «обязательную звездочку» связанного <p:outputLabel>
, просто установите для его атрибутаifyRequired значение true. В противном случае по умолчанию будет auto
и будет применяться только тогда, когда UIInput#isRequired()
соответствующего входного компонента возвращает true
во время фазы ответа рендеринга.
<p:outputLabel ... indicateRequired = "true" />
Мне понадобится некоторое время, чтобы проверить, но в идеале это должно сработать. Итак, примем это как ответ. Подтвержу, как только мое тестирование будет завершено.
Произойдет ли эта привязка, если для команды CommandButton установлено ajax = "false"? <p:commandButton ajax = "false" binding = "#{mainCommandButton}" ... />
Конечно. Обратите внимание, что приведенный выше код остается неизменным. То есть абсолютно не привязывать его к свойству bean-компонента. См. также stackoverflow.com/q/14911158 Обратите внимание, что связанный вопрос содержит альтернативное решение без необходимости использования привязки: жестко запрограммированный идентификатор клиента.
Да, я попробовал, как уже упоминалось, без привязки к свойству компонента. Но проверка при отправке кнопки cmd по-прежнему не происходит. Я обновил раздел кода. Можешь посмотреть? Не уверен, что мне не хватает.
Возможно, вы обнаружили ошибку/причуду PrimeFaces. Параметр запроса кнопки присутствует, но неожиданно имеет пустое значение, когда ajax=false вместо ajax=true. Я обновил ответ.
Ух ты, наконец-то это сработало. Большое спасибо @BalusC. Ты жжешь.
«ajax» занимает центральное место в этом посте. Не знаю, почему тег «ajax» был удален.