Календарь Primefaces, когда требуется, имеет значение true, прослушиватель Ajax не вызывается

Введение: у меня есть 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)

В чем причина и как это решить?

Примечание-

  1. Я экспериментировал с разными свойствами внутри p:ajax, но ничего не помогло: immediate=true, process=@this, update=@this. Также попробовал f:ajax вместо p:ajax.
  2. Для обязательного компонента p:calendar символ звездочки (*) необходим в метке для внешнего вида. Так:

«ajax» занимает центральное место в этом посте. Не знаю, почему тег «ajax» был удален.

satya prakash Panigrahi 24.05.2024 09:36

Это ожидаемое поведение. См. также пункт №3 на сайте stackoverflow.com/q/2118656. Почему именно вы хотите, чтобы методы действия вызывались при ошибке проверки? Похоже, что это не должны быть методы прослушивания ajax. Т.е. у вас проблема с XY. Вам нужно будет сделать шаг назад и подробно объяснить реальную проблему, для которой вы ошибочно полагали, что использование метода прослушивателя ajax будет правильным решением. Тогда мы сможем предложить правильное решение.

BalusC 26.05.2024 17:10

@BalusC- Требование состоит в том, что каждый раз при изменении p:calendar значения серверная часть myBean.calReqOb также должна немедленно обновляться (не дожидаясь отправки командной кнопки). Вот почему я включил слушателей. Внутри прослушивателей нет логики, но при вызове прослушивателя автоматически вызываются установщики объектов bean.

satya prakash Panigrahi 26.05.2024 17:45

Дальше по требованию идёт ещё набор p:selectBooleanCheckbox & p:calendar id = "dependentCal". Когда флажок установлен, dependentCal должен выбрать текущее значение из p:calendar id = "calreq". Вот почему я добавил прослушиватели ajax, поскольку они обновляются немедленно myBean.calReqObj. Для простоты моего поста я не стал добавлять этот фрагмент кода.

satya prakash Panigrahi 26.05.2024 17:59

Тогда это ваше решение: stackoverflow.com/q/14729982

BalusC 26.05.2024 18:03

@BalusC - я обновил последний раздел сообщения «Примечание». Символ звездочки (*) необходим для обязательного поля календаря. Могу ли я добавить звездочку (*) вручную? Я имею в виду, будут проверяться некоторые условия. Если это правда, то звездочка (*) должна появиться независимо от статуса requiredp:calendar id = "calreq".

satya prakash Panigrahi 26.05.2024 19:15
stackoverflow.com/questions/61335838/… . Я попробую этот код- indicateRequired='#{myAction.displayAsterisk}'. Если это сработает, то @BalusC, ваше решение должно идеально соответствовать моим требованиям.
satya prakash Panigrahi 26.05.2024 19:36

Просто поставьте <p:outputLabel indicateRequired = "true"> да.

BalusC 26.05.2024 19:37
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
8
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Судя по комментариям к вопросу, вам, похоже, нужна проверка, зависящая от действия. Таким образом, календарь следует проверять только по мере необходимости при вызове определенного действия, которое является действием основной командной кнопки, а не действием прослушивателя 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" />

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

satya prakash Panigrahi 26.05.2024 19:52

Произойдет ли эта привязка, если для команды CommandButton установлено ajax = "false"? <p:commandButton ajax = "false" binding = "#{mainCommandButton}" ... />

satya prakash Panigrahi 31.05.2024 13:09

Конечно. Обратите внимание, что приведенный выше код остается неизменным. То есть абсолютно не привязывать его к свойству bean-компонента. См. также stackoverflow.com/q/14911158 Обратите внимание, что связанный вопрос содержит альтернативное решение без необходимости использования привязки: жестко запрограммированный идентификатор клиента.

BalusC 31.05.2024 13:33

Да, я попробовал, как уже упоминалось, без привязки к свойству компонента. Но проверка при отправке кнопки cmd по-прежнему не происходит. Я обновил раздел кода. Можешь посмотреть? Не уверен, что мне не хватает.

satya prakash Panigrahi 31.05.2024 14:56

Возможно, вы обнаружили ошибку/причуду PrimeFaces. Параметр запроса кнопки присутствует, но неожиданно имеет пустое значение, когда ajax=false вместо ajax=true. Я обновил ответ.

BalusC 31.05.2024 16:07

Ух ты, наконец-то это сработало. Большое спасибо @BalusC. Ты жжешь.

satya prakash Panigrahi 31.05.2024 16:21

Другие вопросы по теме