2016-09-19 105 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访问面板。