首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EL条件法表达式

EL条件法表达式
EN

Stack Overflow用户
提问于 2011-03-25 14:35:22
回答 2查看 6.2K关注 0票数 4

我想在EL中声明一个条件方法表达式,如下所示:

代码语言:javascript
复制
<p:dataTable id="#{cc.attrs.datatableId}" var="overview" 
    rowSelectListener="#{cc.attrs.detailsMode == 'single' ? cc.attrs.bean.onRowSelect : cc.attrs.bean.onRowUrlSelect}">

然而,它引发了一个EL异常:

javax.el.ELException:不是一个有效的方法表达式:#{ cc.attrs.detailsMode == 'single‘?cc.attrs.bean.onRowSelect : cc.attrs.bean.onRowUrlSelect}

如何声明条件EL方法表达式?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-25 14:43:28

不幸的是,方法表达式不接受值表达式。您最好的选择是有一个方法入口点,然后根据detailsMode进一步委托所需的操作方法,您还可以将该方法传递/设置给bean。

例如。

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

考虑到您实际使用的是复合组件,您可以在必要时将其隐藏在支持组件中,以减少备份bean中的样板:

代码语言:javascript
复制
<cc:interface componentType="yourComponent">
...
<h:dataTable ... rowSelectListener="#{cc.onRowSelect}">
代码语言:javascript
复制
@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 });
     }

}
票数 6
EN

Stack Overflow用户

发布于 2018-09-26 16:02:36

你可以试试

代码语言:javascript
复制
<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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5433876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档