Значение Изменение listner не работает в календаре - программирование
Подтвердить что ты не робот

Значение Изменение listner не работает в календаре

Я использую простые элементы 3.2 и JSF 2.0

Мой сценарий: у меня есть дата файла, последняя дата и следующая дата в моей форме. Когда пользователь вводит дату файла, мне нужно обновить значение даты файла в bean, чтобы его значение можно было использовать как минимальную дату в последнюю дату атрибута и, следовательно, в следующем выборе даты.

Согласно моему знанию, слушатель изменений изменений может выполнять при отправке формы, поэтому я не могу его использовать. Я использовал p: ajax. Но все же я не могу установить дату файла. Поскольку дата файла не задана, она позволяет пользователю выбрать последнюю дату и следующую дату до даты даты файла.

caseMaster.xhtml

<p:calendar value="#{caseUitility.caseMaster.fileDate}" id="fileDate" effect="fadeIn" pattern="dd/MM/yyyy" readOnlyInputText="true">
    <p:ajax event="change" listener="#{caseUitility.dateChange}"/>
</p:calendar>

<p:calendar value="#{caseUitility.caseMaster.lastDate}" required="true" id="lastDate" effect="fadeIn" pattern="dd/MM/yyyy" readOnlyInputText="true" mindate="#{caseUitility.caseMaster.fileDate}" >
</p:calendar>

CaseUitility.java

public void dateChange(ActionEvent ae) {
    System.out.println("File Date: " + caseMaster.getFileDate());
    System.out.println("Hello... I am in DateChange");
}

Может ли кто-нибудь объяснить мне, что я делаю неправильно здесь?

4b9b3361

Ответ 1

В более поздних версиях PrimeFaces следует использовать SelectEvent следующий фрагмент кода

<p:calendar id="event" value="#{calendarView.date4}">
    <p:ajax event="dateSelect" listener="#{calendarView.onDateSelect}" update="msgs" />
</p:calendar>
public void onDateSelect(SelectEvent event) {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
    facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Date Selected", format.format(event.getObject())));
}

В старых версиях правлений используются DateSelectEvent

<p:ajax event="dateSelect" listener="#{caseUitility.dateChange}"/>
public void dateChange(DateSelectEvent event) {
    Date date = event.getDate();
    System.out.println("File Date: " + date);
    System.out.println("Hello... I am in DateChange");
}

Ответ 2

Вам следует добавить обновление к вашему p: ajax. У меня были проблемы при выборе даты с помощью datepicker и при ручном вводе ее в поле. Событие изменения не было запущено в обоих направлениях. Поэтому я использовал p: ajax и f: ajax с разными событиями.

<p:calendar value="#{caseUitility.caseMaster.fileDate}" id="fileDate" effect="fadeIn" pattern="dd/MM/yyyy" readOnlyInputText="true">
    <p:ajax event="dateSelect" listener="#{caseUitility.dateSelect}" update="lastDate"/>
    <f:ajax event="change" execute="@this" render="lastDate" listener="#{caseUitility.dateChange}"/>
</p:calendar>

И в bean

public void dateSelect(DateSelectEvent event) {
    caseMaster.setFileDate(event.getDate());
    System.out.println("File Date: " + caseMaster.getFileDate());
    System.out.println("Hello... I am in DateChange");
}

public void dateChange(AjaxBehaviorEvent event) throws MWSException {
    System.out.println("File Date: " + caseMaster.getFileDate());
    System.out.println("Hello... I am in DateChange");
}

Надеюсь, что это поможет

Ответ 3

Мое решение:

<p:ajax event="change" listener="#{caseUitility.dateChange}"/>

И в bean:

public void dateChange(SelectEvent event) 
{   
      date = (Date)event.getObject();
}

Ответ 4

Думаю, вы должны это сделать:

<p:calendar id="fileDate" value="#{caseUitility.caseMaster.fileDate}" navigator="true" effect="slideDown" mindate="#{caseUitility.today}" readOnlyInputText="true" pattern="dd/MM/yyyy HH:mm" required="true"  showOn="button" autocomplete="false">
    <p:ajax event="focus" listener="#{caseUitility.dateChange}" update="lastDate" />
</p:calendar>

public void dateChange()  {
     System.out.println("File Date: " + caseMaster.getFileDate());
}

Если вы используете событие "focus", оно будет срабатывать при изменении или dateSelect для управления прозрачностью календаря.

Ответ 5

Использовать событие ajax как dateSelect как

<p:calendar value="#{caseUitility.caseMaster.fileDate}" id="fileDate" effect="fadeIn" pattern="dd/MM/yyyy" readOnlyInputText="true">
        <p:ajax event="dateSelect" process="@this" update="lastDate" listener="#{caseUitility.dateChange}"/>
</p:calendar>   
<p:calendar value="#{caseUitility.caseMaster.lastDate}" required="true" id="lastDate" effect="fadeIn" pattern="dd/MM/yyyy" readOnlyInputText="true" mindate="#{caseUitility.caseMaster.fileDate}" >
</p:calendar>

Слушатель,

public void dateChange(SelectEvent event) {
    System.out.println("File Date: " + (Date) event.getObject());
    System.out.println("Hello... I am in DateChange");
}

но имейте в виду, что вы не должны использовать какой-либо другой идентификатор компонента в процессе (означает, что только @это разрешено в процессе), иначе слушатель не будет работать.

Ответ 6

Вы можете использовать onstart и oncomplete (не отображается в документах praces).

Я решил с этим:

<p:calendar
      id="fromDate"
      value="#{reportBean.fromDate}"
      pattern="dd/MM/yyyy"
      locale="es"
      maxdate="#{reportBean.untilDate}">
      <p:ajax event="dateSelect" 
          onstart="openModal();" 
          oncomplete="closeModal();"  
          update="untilDate div_report"/>
</p:calendar>

JavaScript:

function openModal(){
    $('#mdlLoading').modal('open');
}
function closeModal(){
    $('#mdlLoading').modal('close');
}

Надеюсь, что это поможет кому-то!