EL conditional Method Expression

前端 未结 2 1286
陌清茗
陌清茗 2021-01-14 11:42

I would like to declare a conditional method expression in EL like below:



        
相关标签:
2条回答
  • 2021-01-14 12:04

    You can try with

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

    For further reference, you can refer to https://docs.oracle.com/javaee/6/tutorial/doc/bnahu.html#bnahz

    0 讨论(0)
  • 2021-01-14 12:05

    Unfortunately, method expressions does not accept value expressions. Your best bet is to have a single method entry point which in turn delegates further to the desired action methods based on the detailsMode which you also pass/set to the bean.

    E.g.

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

    Given that you're actually using a composite component, you can if necessary hide it away in the backing component to reduce boilerplate in backing 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 });
         }
    
    }
    
    0 讨论(0)
提交回复
热议问题