4

以下のように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メソッド式を宣言するにはどうすればよいですか?

4

2 に答える 2

6

残念ながら、メソッド式は値式を受け入れません。最善の策は、単一のメソッドエントリポイントを用意することです。このエントリポイントdetailsModeは、Beanに渡す/設定するメソッドに基づいて、目的のアクションメソッドにさらに委任します。

例えば

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

}
于 2011-03-25T14:43:28.183 に答える
0

あなたはで試すことができます

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

詳細については、 https://docs.oracle.com/javaee/6/tutorial/doc/bnahu.html#bnahzを参照してください。

于 2018-09-26T16:02:36.927 に答える