Primefaces p:commandButton:仅在f:setPropertyActionListener之前禁用

时间:2013-03-18 16:29:04

标签: jsf primefaces

我正在使用<p:dataTable>而在<p:column>中我必须在bean中指定的一个条件中禁用<p:commandButton>

以下是表格:

<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()方法中,selectedFlusso初始化了f:setPropertyActionListener。调用该方法时,selectedFlussonull。 如何设置selectedFlusso,以便在<p:commandButton>的已停用属性中不null

2 个答案:

答案 0 :(得分:2)

当呈现按钮的HTML表示时,不会调用<f:setPropertyActionListener>,正如您所期望的那样。相反,只有在通过相关按钮提交表单并且其操作已排队时才会调用它。

如果你想继续使用这个奇怪的设计 - 我刚刚使用了

disabled="#{!flusso.dettaglio}"

而不是 - 那么你最好的选择是以编程方式评估getter中的#{flusso}

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

另见How to call a method with a parameter in JSF

无论基于当前设计的解决方案如何,这种设计都是“奇怪的”,因为它可能非常昂贵。另请参阅Why JSF calls getters multiple times

答案 1 :(得分:0)

你可以使用类似的东西

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

并在你的bean中:

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