2016-09-19 4 views
0

開始日と終了日を選択するために、2つのカレンダーコンポーネントでページを変更しています。私はそれらのいずれかを修正するたびに開始日が終了日の前であることをチェックさせるはずです。開始が終了またはそれ以降に設定されている場合、コードによって終了日が最大日付に変更され、警告がポップされます。Ajaxイベントの変更後にPrimefacesカレンダーを更新するにはどうすれば新しい値が検証されますか?

イベントリスナーは正常に実行されますが、終了日カレンダーは新しい値を反映するために更新されません。リスナーが値を変更する前に更新されるわけではありません.-それはまったく更新できません。

プロジェクトは、Primeface 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の変更イベントがトリガされませんので、2つのAjaxのイベントがあります。カレンダーとPrimeFaces dateSelectは、日付を入力するときにトリガーされません。

カレンダーからのonSelectUpdateと、両方のajaxイベントからのレンダリングと更新を@this、@form、end日付カレンダーのID、両方のカレンダー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" /> 

あなたはendDateにはnullに設定され、あなたがendDateにカレンダーを更新する方法をトリガーたstartDateを選択すると、これはまずmindate="#{managedBean.startDate}"

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

試してみましたが、endDateをnullに設定しても、p:calendarコンポーネントをリフレッシュするのに役立ちません。表示されている最後の値が表示されます。 –

0

によって制限されます。f:AjaxがFで、update属性を持っていない:AJAXあなたがレンダリング属性を使用する必要があります。

P:それは問題が解決しない場合

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

:あなたはIDを変更し、その周り形をしたんアヤックスonCompleteの属性を持つremoteCommandが問題を解決する必要がありますか? without prependId = "false"を指定した場合は、フォーム内のすべてのIDの前にform1が付加されます。したがって、exampleForm:fl83を使用してパネルにアクセスする必要があります。

関連する問題