1

我正在使用<p:dataTable>并且在<p:column>我有一个<p:commandButton>必须在 bean 中指定的一种条件下禁用的。

这是表格:

<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);
}

此方法查询数据库并返回truefalse取决于是否selectedFlusso响应条件。

问题是这样的:在方法中isDettaglio()selectedFlussof:setPropertyActionListener. 当方法被调用时,selectedFlussonull. 如何在is notselectedFlusso的 disabled 属性中进行设置?<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 多次调用 getter

于 2013-03-18T17:10:17.560 回答
0

你可以使用类似的东西

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

在你的 bean 中:

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