我可以从监听器中的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>
在select上我需要将我的侦听器绑定到两个方法? 这是允许的吗?
我有一棵树,当我做出选择时,我需要更新(触发)两个组件(另外两个后面的bean)。 listener属性是否有两个参数(两个方法名称)? 感谢。
Myclass1 class {
method1();
}
Myclass2 class {
method2();
}
答案 0 :(得分:4)
如果要从另一个ManagedBean调用一个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}" />
答案 1 :(得分: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,则可以选择将一个托管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();
}
}