1

私は使用<p:dataTable>しており<p:column><p:commandButton>Bean で指定されている 1 つの条件で無効にする必要があります。

フォームは次のとおりです。

<p:dataTable var="flusso" id="flussoList" rows="5"
            widgetVar="flussoTable" value="#{invioFlussiTUManagedBean.flussi}"
            filteredValue="#{invioFlussiTUManagedBean.filteredFlussi}"
            emptyMessage="#{i18n['tu.msg.emptysearch']}" paginator="true"
            paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}">

     <p:column style="width:100px;height:35px;">

             <p:commandButton
                        update=":invioFlForm:flussoList :invioFlForm:displayConfirm"
                        icon="ui-icon-extlink" oncomplete="confirmation.show()"
                        title="#{i18n['tu.button.flusso.invia']}"
                        rendered="#{flusso.statoFlusso.code == 'DS'}"
                        disabled="#{!invioFlussiTUManagedBean.dettaglio}">
                        <f:setPropertyActionListener value="#{flusso}"
                            target="#{invioFlussiTUManagedBean.selectedFlusso}" />
                        <f:setPropertyActionListener value="#{false}"
                            target="#{invioFlussiTUManagedBean.modoInvioTutti}" />
            </p:commandButton>
     </p:column>
</p:dataTable>

私のManagedBeanで:

public boolean isDettaglio() {
    return flussiTURepository.isDettaglio(selectedFlusso);
}

このメソッドはデータベースにクエリを実行し、条件に応答するかどうかに応じてtrueorを返します。falseselectedFlusso

問題はこれです: メソッドisDettaglio()selectedFlussoは、 は で初期化されますf:setPropertyActionListener。メソッドが呼び出されると、selectedFlussoですnullselectedFlussoの無効化された属性で<p:commandButton>はないように設定するにはどうすればよいnullですか?

4

2 に答える 2

2

ご想像の<f:setPropertyActionListener>とおり、ボタンの HTML 表現がレンダリングされるときに は呼び出されません。代わりに、問題のボタンを介してフォームが送信され、そのアクションがキューに入れられたときにのみ呼び出されます。

この奇妙なデザインを使い続けたい場合は、

disabled="#{!flusso.dettaglio}"

代わりに — 最善の策は#{flusso}、getter 内でプログラムによって評価することです。

public boolean isDettaglio() {
    FacesContext context = FacesContext.getCurrentInstance();
    Flusso currentFlusso = context.getApplication().evaluateExpressionGet(context, "#{flusso}", Flusso.class);
    return flussiTURepository.isDettaglio(currentFlusso);
}

環境が引数でメソッドを呼び出す新しい EL 2.2 機能をサポートする場合は、単に使用できることに注意してください。

disabled="#{!invioFlussiTUManagedBean.isDettaglio(flusso)}"

JSF でパラメーターを使用してメソッドを呼び出す方法も参照してください。

現在の設計に基づくソリューションに関係なく、この設計は「奇妙」です。非常に高価になる可能性があるからです。JSF がゲッターを複数回呼び出す理由も参照してください。

于 2013-03-18T17:10:17.560 に答える
0

あなたはそのようなものを使うことができます

<p:commandButton disabled=#{!invioFlussiTUManagedBean.isDettaglio(flusso)}

そしてあなたの豆で:

public boolean isDettaglio(Flusso selectedFlusso) {
    return flussiTURepository.isDettaglio(selectedFlusso);
}
于 2013-03-18T16:38:06.427 に答える