我正在使用<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);
}
此方法查询数据库并返回true
或false
,具体取决于selectedFlusso
是否响应条件。
问题是:在isDettaglio()
方法中,selectedFlusso
初始化了f:setPropertyActionListener
。调用该方法时,selectedFlusso
为null
。
如何设置selectedFlusso
,以便在<p:commandButton>
的已停用属性中不null
?
答案 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);
}