我可以从 <p:ajax event=select listner=method1,method2> 调用多个方法吗?

Qaj*_*ssi 5 ajax jsf primefaces

我可以从监听器中的 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>
Run Code Online (Sandbox Code Playgroud)

在选择上我需要将我的侦听器绑定到两种方法?允许吗?

我有一棵树,当我进行选择时,我需要更新(触发)两个组件(另外两个后台 bean)。侦听器属性是否采用两个参数(两个方法名称)?谢谢。

Myclass1 class {
 method1();
 }



Myclass2 class {
 method2();

 }
Run Code Online (Sandbox Code Playgroud)

Kis*_*ash 5

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

@ManagedBean
public class MyBean1{

   public void methodAbc(){
     ...
   }
}
Run Code Online (Sandbox Code Playgroud)

注入到

@ManagedBean
public class MyBean2{

   @ManagedProperty(value = "#{myBean1}")
   private MyBean1 mybean1;

   //SETTER GETTER for mybean1

   public void myAction(){
     mybean1.methodAbc();
   }
}
Run Code Online (Sandbox Code Playgroud)

下表给出了兼容的 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();
}
Run Code Online (Sandbox Code Playgroud)

由于您使用的是 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}" />
Run Code Online (Sandbox Code Playgroud)


Lui*_*oza 2

不,事实并非如此。您可以使用一个方法来调用需要执行的两个或多个方法:

<p:ajax event="select" listener="#{someMB.multipleMethods}" update=":pchartId,:panelId" />
Run Code Online (Sandbox Code Playgroud)

而在Java方面

@ManagedBean
@ViewScoped
public class SomeMB {
    public void method1() { /* */ }
    public void method2() { /* */ }
    public void multipleMethods() { 
        method1();
        method2();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您需要使用多个托管 bean,一种选择是将一个托管 bean 注入另一个托管 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();
    }
}
Run Code Online (Sandbox Code Playgroud)