我们使用PrimeFaces 3.3.1,Mojarra 2.1.10和Tomcat 7.0.26。
我们的应用程序中的所有组件都是以编程方式创建的,并且只绑定了页面上的根组件。这是页面 - 模板的一部分 - 绑定到根组件,Panel名为rootPanel:
<ui:composition template="/layout/template.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:porta="http://java.sun.com/jsf/composite/porta"
xmlns:p="http://primefaces.org/ui">
<ui:define name="body">
<h:messages globalOnly="true" styleClass="message" />
<p:ajaxStatus onstart="statusDialog.show();"
onsuccess="statusDialog.hide();" />
<p:dialog modal="true" widgetVar="statusDialog" header=".::."
draggable="false" closable="false">
<p:graphicImage value="/img/progressbar.gif" />
</p:dialog>
<h:form id="initForm" name="initform">
<p:panel id="rootPanelId" binding="#{applicationErp.rootPanel}"
rendered="true">
</p:panel>
</h:form>
</ui:define>
</ui:composition>
这是我们以编程方式创建TabView组件的方式:
mainTabbedPane = new TabView();
mainTabbedPane.setId("formErpMainTabViewId");
mainTabbedPane.setStyle("height: 100%; width: 100%;");
AjaxBehavior ajaxBehavior = new AjaxBehavior();
MethodExpression methodExpression = FacesUtil.createMethodExpression("#{formerpmain.tabChanged}", Void.class, new Class<?>[]{TabChangeEvent.class});
ajaxBehavior.addAjaxBehaviorListener(new AjaxBehaviorListenerImpl(methodExpression));
ajaxBehavior.setListener(methodExpression);
ajaxBehavior.setUpdate(":initForm:formErpMainTabViewId");
mainTabbedPane.addClientBehavior("tabChange",ajaxBehavior);
这是tabChanged方法:
public void tabChanged(TabChangeEvent event){
requestPartialRendering();
}
方法tabChanged,在上面的MethodExpression中指定,永远不会在制表符更改时调用。这是指定要在制表符更改上调用的方法的正确方法吗?如何指定要在选项卡上调用的bean方法更改?
答案 0 :(得分:1)
经过几天的实验,我们找到了解决方案。我们将“@ parent”值设置为setProcess方法,只有该值有效并从MethodExpression的参数列表中删除TabChangedEvent。完成这些更改后,它可以正常工作。
代码:
AjaxBehavior ajaxBehavior = new AjaxBehavior();
MethodExpression methodExpression = FacesUtil.createMethodExpression(
"#{formerpmain.onTabChange}", void.class, new Class<?>[]{});
ajaxBehavior.addAjaxBehaviorListener(
new AjaxBehaviorListenerImpl(methodExpression));
ajaxBehavior.setListener(methodExpression);
ajaxBehavior.setProcess("@parent");