0

開始日と終了日を選択するために、2 つの Calendar コンポーネントを含むページを変更しています。いずれかを変更するたびに、開始日が終了日より前であることを確認するようにすることになっています。開始が終了の後に設定されている場合、またはその逆の場合、コードは終了日を最大の日付に変更し、警告をポップします。

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

プロジェクトは、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 がトリガーされないため、2 つの Ajax イベントがあります。

カレンダーからの onSelectUpdate と、両方の ajax イベントからのレンダリングと更新を試しました。それらを @this、@form、終了日カレンダーの ID、両方のカレンダーの ID、カレンダーの outputPanel の ID、および共通の outputPanel の ID に設定します。いまいましいカレンダーだけ。更新しません。

私は途方にくれており、Google Fu も機能する解決策を見つけられません。

4

2 に答える 2

3

開始日カレンダーをクリックして 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 に設定するメソッドをトリガーする startDate を選択し、endDate カレンダーを更新すると、mindate="#{managedBean.startDate}"

public void OnSelectDateSouhaite() {
    this.setEndDate(null);
}
于 2016-09-19T12:46:06.373 に答える