2016-09-19 58 views
0

我正在使用兩個日曆組件修改頁面,以選擇開始日期和結束日期。我應該讓他們檢查開始日期是否在結束日期之前,無論你何時修改它們;如果在結束後設置了開始或反之亦然,則代碼將結束日期更改爲最大日期並彈出警告。如何在更改後強制更新Primefaces日曆Ajax事件驗證新值?

事件偵聽器運行正常,但結束日期日曆無法更新以反映新值;這並不是它在聽衆更改值之前更新 - 它根本無法更新。

該項目在Primefaces 5.3和Java 1.6上運行。這是XHTML(減去樣式可讀性):

<p:outputPanel id="fl83"> 
    <p:outputPanel id="fl83c3"> 
     <h:outputLabel value="Start date" for="fechaInicioMP" /> 
     <p:calendar locale="es" pattern="dd/MM/yyyy" id="fechaInicioMP" 
      maxdate="#{filtroFechasBB.fechaMaxFin}" value="#{filtroFechasBB.fechaInicio}" 
      onSelectUpdate=":f183" > 
      <p:ajax event="blur" /> 
      <f:ajax event="change" listener="#{filtroFechasBB.fechaInicioTextChange}" 
       render="@this" update="@form" /> 
      <p:ajax event="dateSelect" listener="#{filtroFechasBB.fechaInicioClickChange}" 
       update="@form" /> 
     </p:calendar> 
    </p:outputPanel> 
    <p:outputPanel id="fl83c4"> 
     <h:outputLabel value="End date" for="fechaFinMP" /> 
     <p:calendar locale="es" pattern="dd/MM/yyyy" id="fechaFinMP" 
      maxdate="#{filtroFechasBB.fechaMaxFin}" value="#{filtroFechasBB.fechaFin}" 
      onSelectUpdate=":f183" > 
      <p:ajax event="blur" /> 
      <f:ajax event="change" listener="#{filtroFechasBB.fechaFinTextChange}" 
       render="@this" update=":fl83" /> 
      <p:ajax event="dateSelect" listener="#{filtroFechasBB.fechaFinClickChange}" 
       update=":fl83" /> 
     </p:calendar> 
    </p:outputPanel> 
</p:outputPanel> 

而這些聽衆:

public void fechaFinTextChange() { 
    if(fechaFin.after(fechaMaxFin)) { 
     fechaFin = fechaMaxFin; 
     addErrorMessage(FFIN_AFTER_FMAX); 
    } 
    compareInicioBeforeFin(); 
} 

public void fechaFinClickChange(SelectEvent event) { 
    setFechaFin((Date)event.getObject()); // I couldn't find out why this is here given that 
              // the setter has already been called 
    compareInicioBeforeFin(); 
    if (updateMetodoEntreBB != null) { 
     ajaxActualiza(event, OpcionesAjax.F_FIN); 
    } 
} 

// fechaInicioTextChange and fechaInicioClickChange do pretty much the same as these two 

private void compareInicioBeforeFin() { 
    if(fechaInicio.after(fechaFin)) { 
     fechaFin = fechaMaxFin; 
     addErrorMessage(FINI_AFTER_FFIN); 
    } 
} 

有兩種阿賈克斯事件,因爲當你點擊的JSF更改事件不觸發日曆和PrimeFaces dateSelect不會觸發當您鍵入日期英寸

我試過onSelectUpdate從日曆和渲染和更新從這兩個ajax事件,將它們設置爲@this,@form,結束日期日曆的ID,兩個日曆的ID,日曆outputPanel的ID和公共的outputPanel的ID,以及該死的日曆只是。不會更新。

我在我的智慧'結束,我的Google Fu沒有找到任何可行的解決方案。

回答

1

您需要在開始日期日曆的點擊設置一個Ajax事件:

<p:calendar id="start_date" pattern="dd/MM/yyyy HH:mm" value="#{managedBean.startDate}" size="20" > 
    <p:ajax event="dateSelect" listener="#{managedBean.OnSelectDate()}" update=":form:end_date" /> 
</p:calendar> 

<p:calendar id="end_date" pattern="dd/MM/yyyy HH:mm" mindate="#{managedBean.startDate}" value="#{managedBean.endDate}" size="20" /> 

當您選擇觸發,你設定結束日期爲空,並更新結束日期的日曆的方法起始日期, F::這是由mindate="#{managedBean.startDate}"

public void OnSelectDateSouhaite() { 
    this.setEndDate(null); 
} 
+0

試過了,將該設置的endDate設置爲null並不能幫助我刷新p:calendar組件。它只是顯示最後一個可見的值。 –

0

首先有限阿賈克斯沒有更新的屬性,在F:阿賈克斯,您需要使用所述渲染屬性。

一個p:remoteCommand與阿賈克斯的onComplete屬性應該解決的問題:

<p:outputPanel id="fl83"> 
<p:remoteCommand name="updateCalendar" update="fl83" /> 
    <p:outputPanel id="fl83c3"> 
     <h:outputLabel value="Start date" for="fechaInicioMP" /> 
     <p:calendar locale="es" pattern="dd/MM/yyyy" id="fechaInicioMP" 
      maxdate="#{filtroFechasBB.fechaMaxFin}" value="#{filtroFechasBB.fechaInicio}" 
      onSelectUpdate=":f183" > 
      <p:ajax event="blur" /> 
      <f:ajax event="change" listener="#{filtroFechasBB.fechaInicioTextChange}" 
       oncomplete="updateCalendar()" /> 
      <p:ajax event="dateSelect" listener="#{filtroFechasBB.fechaInicioClickChange}" 
       oncomplete="updateCalendar()" /> 
     </p:calendar> 
    </p:outputPanel> 
    <p:outputPanel id="fl83c4"> 
     <h:outputLabel value="End date" for="fechaFinMP" /> 
     <p:calendar locale="es" pattern="dd/MM/yyyy" id="fechaFinMP" 
      maxdate="#{filtroFechasBB.fechaMaxFin}" value="#{filtroFechasBB.fechaFin}" 
      onSelectUpdate="f183" > 
      <p:ajax event="blur" /> 
      <f:ajax event="change" listener="#{filtroFechasBB.fechaFinTextChange}" 
       oncomplete="updateCalendar()" /> 
      <p:ajax event="dateSelect" listener="#{filtroFechasBB.fechaFinClickChange}" 
       oncomplete="updateCalendar()" /> 
     </p:calendar> 
    </p:outputPanel> 
</p:outputPanel> 

如果不解決這個問題:你已經一個周圍形成其修改IDS?如果你有一個沒有prependId =「false」的form1被預先添加到表單中的每個id。所以你需要使用exampleForm:fl83訪問面板。