2013-03-18 30 views
1

我使用<p:dataTable><p:column>我有<p:commandButton>必须在bean中指定的一个条件中禁用。Primefaces p:commandButton:仅在f:setPropertyActionListener之前工作

这里的形式:

<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

+1

你的问题很混乱。代码片段和问题中的描述似乎并不匹配。你真的用'isDettaglio'和'disableDettaglio'来表示同一件事吗?如果是这样,为什么你不只是'disabled =“#{flusso.dettaglio}”'? – BalusC 2013-03-18 16:36:02

+0

你说得对,对不起!我做了一些测试,但我还没有恢复原来的。 disableDettaglio在现实中是这样的:dettaglio是这样的: disabled =“#{!invioFlussiTUManagedBean.dettaglio}”> – 2013-03-18 16:52:10

回答

2

的你似乎希望当按钮的HTML表示渲染<f:setPropertyActionListener>不调用。相反,只有在通过有问题的按钮提交表单并且其行为已排队时才会调用它。

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

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

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

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

+0

感谢您的回答。你能告诉我如何让我的环境支持新的EL 2.2? – 2013-03-18 17:24:10

+0

单击“另请参见”链接。它不包括装饰:) – BalusC 2013-03-18 17:27:08

+0

很好的答案@BalusC!我总是最终在另一个托管bean中添加托管的bean,以便获取单个变量或表达式,evaluateExpression对于某些场景来说是一个很好的选择。 – 2013-03-18 17:30:00

0

你可以使用类似的东西

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

,并在你的bean:

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

注意到应该是这只适用于Servlet 3.0/EL 2.2,并且从OP的问题中不清楚他是否正在使用它。 JSF 2.x即向后兼容Servlet 2.5和EL 2.1。你永远不应该假定EL 2.2永远存在于JSF 2中。x,除非问题或代码片段另有说明(在这种情况下,似乎并不是这种情况)。 – BalusC 2013-03-18 16:38:50

+0

@BalusC好的我没有意识到这一点。谢谢! – phoenix7360 2013-03-18 16:39:41

+0

根据您的建议,我有以下例外: 18.03.2013 18:01:52 *错误* DefaultExceptionHandler:handleUnexpected - 发生意外的内部错误 - (DefaultExceptionHandler.java,第119行) javax.faces.view .facelets.TagAttributeException:/tu/invio-flussi-tu.xhtml @ 77,68 disabled =“#{!invioFlussiTUManagedBean.isDettaglio(flusso)}”错误解析:#{!invioFlussiTUManagedBean.isDettaglio(flusso)} – 2013-03-18 17:04:10

相关问题