2011-03-25 33 views
3

我想在EL聲明一個條件方法表達式象下面這樣:EL條件方法表達

<p:dataTable id="#{cc.attrs.datatableId}" var="overview" 
    rowSelectListener="#{cc.attrs.detailsMode == 'single' ? cc.attrs.bean.onRowSelect : cc.attrs.bean.onRowUrlSelect}"> 

然而,引發EL異常:

javax.el.E​​LException:不是有效方法表達式:#{cc.attrs.detailsMode =='single'? cc.attrs.bean.onRowSelect:cc.attrs.bean.onRowUrlSelect}

我如何聲明一個條件EL方法表達式?

回答

6

不幸的是,方法表達式不接受值表達式。最好的辦法是有一個方法入口點,然後根據您也傳遞/設置爲bean的detailsMode進一步代理到期望的操作方法。

E.g.

<h:dataTable ... rowSelectListener="#{cc.attrs.bean.onRowSelect}"> 
public void onRowSelect(SelectEvent event) { 
    if ("single".equals(detailsMode)) { 
     onRowSingleSelect(event); 
    } else { 
     onRowUrlSelect(event); 
    } 
} 

既然你實際使用的複合成分,如果必要,可以把它隱藏掉在底層組件,以減少在後臺bean的樣板:

<cc:interface componentType="yourComponent"> 
... 
<h:dataTable ... rowSelectListener="#{cc.onRowSelect}"> 
@FacesComponent("yourComponent") 
public class YourComponent extends UINamingContainer { 

    public void onRowSelect(SelectEvent event) { 
     String methodName = "single".equals(detailsMode) ? "onRowSingleSelect" : "onRowUrlSelect"; 
     MethodExpression method = (MethodExpression) getAttributes().get(methodName); 
     method.invoke(getFacesContext().getELContext(), new Object[] { event }); 
    } 

}