2012-12-31 7 views
17

Używam primefaces JSF 3.2 i 2.0Wartość Zmień listner nie pracuje w primefaces kalendarzu

Mój scenariusz mam datę pliku, datę ostatniej i następnej daty w moim formularzu. Kiedy użytkownik wpisuje datę pliku, muszę zaktualizować wartość daty pliku w komponencie bean, aby jego wartość mogła zostać użyta jako minimalna data w ostatniej dacie atrybutu mindate i tak w następnym wyborze daty.

Zgodnie z moją wiedzą, wartość detektora zmian można wykonać przy składaniu formularza, więc nie mogę z niego korzystać. Użyłem p: ajax. Ale nadal nie mogę ustawić daty pliku. Ponieważ data pliku nie jest ustawiona, pozwala użytkownikowi wybrać ostatnią datę i następną datę przed datą daty pliku.

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"); 
} 

może mi żadnych instrukcji, co robię źle tutaj?

Odpowiedz

26

W nowszych wersjach PrimeFaces, SelectEvent powinny być usedsee poniższym fragmencie kodu

<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()))); 
} 

W starszych primefaces wersje wykorzystują 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"); 
} 
+1

wielkie dzięki @Daniel .... Uratowałeś moje pół dnia .... jeszcze raz dzięki. Czy możesz mi powiedzieć, jak mogę wiedzieć/dowiedzieć się o zdarzeniach ajax dla różnego rodzaju składników. Jako najważniejsze nie zapewnia żadnej pomocy dotyczącej wydarzeń. – mrugeshthaker

+3

Serdecznie zapraszam, najważniejsze informacje zawierają wszystkie potrzebne informacje w Przewodniku użytkownika: http://primefaces.org/documentation.html – Daniel

+0

Thanx @ Daniel, działa –

17

Powinieneś dodać aktualizację do swojego p: ajax. Miałem problemy z wyborem daty z datepicker i ręcznym wpisywaniem go w polu. Zdarzenie zmiany nie zostało wywołane w obie strony. Dlatego użyłem p: ajax i f: ajax z różnymi zdarzeniami.

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

A w fasoli

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"); 
} 

Nadzieja to pomaga

+0

Jaki jest powód użycia 2 różnych Tagi ajax, jeden p: ajax i jeden f: ajax. Dlaczego nie oba p: ajax? – Chris

+1

@Chris, z tego, co powiedział, Zgaduję, że obejmuje użytkownika, który klika kalendarz i wybiera datę, ale nie zmienia daty, zmieniając tekst . W takim przypadku obejmuje przypadek, w którym użytkownik ręcznie zmienia tekst w polu tekstowym. – Pixelstix

+0

@pixelstix prawda – roel

0

myślę, że trzeba wziąć pod uwagę ten sposób:

<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()); 
} 

przypadku korzystania z "Focus" zdarzenie, zostanie wyzwolony przy zmianie lub dacieWybierz kontrolkę nadrzędnych kalendarzy.

1

Moje rozwiązanie:

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

A w fasoli:

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

użycie ajax zdarzenia jako dateSelect jak

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

słuchacza,

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

Pamiętaj jednak, że nie powinieneś używać żadnego innego identyfikatora komponentu w procesie (oznacza to tylko, że jest to dozwolone), w przeciwnym razie detektor nie będzie działał.

0

Można użyć onstart i oncomplete (nie pojawia się w dokumencie pierwotnym).

I rozwiązany, że:

<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'); 
} 

nadzieję, że to komuś pomóc!