【问题标题】:Can I call multiple methods from <p:ajax event=select listner=method1, metho2>?我可以从 <p:ajax event=select listner=method1, method2> 调用多个方法吗?
【发布时间】:2014-10-18 18:17:12
【问题描述】:

我可以从监听器中的 ajax 事件选择中调用多个方法吗?

<p:tree value="#{ddTreeBean.root}" var="node" dynamic="true"
                selectionMode="single" selection="#{ddTreeBean.selectedNode}">

<p:ajax event="select" listener="#{data2.refresh}"
                    update=":pchartId,:panelId">
                    </p:ajax>
        <p:treeNode type="node" expandedIcon="folder-open"
                    collapsedIcon="folder-collapsed">
                    <h:outputText value="#{node.name}" />
                </p:treeNode>

                <p:treeNode type="leaf" icon="document-node">
                    <h:outputText value="#{node.name}" />
                </p:treeNode>
            </p:tree>

在选择时我需要将我的监听器绑定到两个方法? 允许吗?

我有一棵树,当我进行选择时,我需要更新(触发)两个组件(另外两个 back bean)。 listener 属性是否接受两个参数(两个方法名)? 谢谢。

Myclass1 class {
 method1();
 }



Myclass2 class {
 method2();

 }

【问题讨论】:

    标签: ajax jsf primefaces


    【解决方案1】:

    如果你想从另一个 ManagedBean 调用一个方法,你必须注入另一个 ManagedBean。

    @ManagedBean
    public class MyBean1{
    
       public void methodAbc(){
         ...
       }
    }
    

    注入到

    @ManagedBean
    public class MyBean2{
    
       @ManagedProperty(value = "#{myBean1}")
       private MyBean1 mybean1;
    
       //SETTER GETTER for mybean1
    
       public void myAction(){
         mybean1.methodAbc();
       }
    }
    

    兼容的 ManagedBean 注入范围如下表(由 Core Java Server Faces Book 提供):

    或者您可以在 Action 方法本身中动态解析 EL 表达式,如下所示。

    public void myAction(){
       FacesContext fctx = FacesContext.getCurrentInstance();
       MyBean1 mybean1 = fctx.getApplication().evaluateExpressionGet(fctx , "#{myBean1}", MyBean1.class);
       mybean1.methodAbc();
    }
    

    由于您使用的是 Primefaces,因此还有另一种方法可以做到这一点,使用 p:remoteCommand

    <p:ajax event="select" listener="#{data2.refresh}"
            update=":pchartId,:panelId" 
            oncomplete="callRemote2()"/>
    
    <p:remoteCommand name="callRemote" partialSubmit="true" process="@this" 
                     action="#{yourmanagedbean.method2}" />
    

    【讨论】:

      【解决方案2】:

      不,它没有。您可以在一个方法中调用需要执行的两个或多个方法:

      <p:ajax event="select" listener="#{someMB.multipleMethods}" update=":pchartId,:panelId" />
      

      在Java方面

      @ManagedBean
      @ViewScoped
      public class SomeMB {
          public void method1() { /* */ }
          public void method2() { /* */ }
          public void multipleMethods() { 
              method1();
              method2();
          }
      }
      

      如果您需要使用多个托管 bean,一种选择是将一个注入另一个:

      @ManagedBean
      @SessionScoped
      public class AnotherMB {
          public void method2() { /* */ }
      }
      
      @ManagedBean
      @ViewScoped
      public class SomeMB {
      
          @ManagedProperty("#{anotherMB}")
          AnotherMB anotherMB;
      
          //provide a setter
          public void setAnotherMB(AnotherMB anotherMB) {
              this.anotherMB = anotherMB;
          }
      
          public void method1() { /* */ }
          public void multipleMethods() { 
              method1();
              anotherMB.method2();
          }
      }
      

      【讨论】:

      • 我必须在两个不同的支持 bean 中调用两个方法。公共类 MB1 {public void updateDisplay();} 公共类 MB2 {public void updateChart();} 两个方法不在同一个支持 bean 上。
      • @user3482742 答案已更新以显示如何将 bean 注入另一个。如果您使用 CDI,这会更简单。
      • 看起来它会起作用。我会试一试。基本上我有一个包含 2-4 个组件的 primefaces 树,它接收选择并根据选择更新其组件。谢谢,如果我能完成这项工作,我会回复你。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      相关资源
      最近更新 更多