2012-07-16 34 views
1

我们使用PrimeFaces 3.3.1,Mojarra 2.1.10和Tomcat 7.0.26。Primefaces tabChange通知

我们的应用程序中的所有组件都是以编程方式创建的,并且只有页面上的根组件被绑定。这是页面 - 模板的一部分 - 与绑定到根组件,面板被称为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

有什么特别的理由让你以编程方式创建组件? – siebz0r 2012-07-17 14:20:07

+0

是的。我们正在建立ERP系统。我们使用抽象类来指定布局,组件的工厂方法等。我们也有特定的类来扩展variuos平台,Swing,Android,PrimeFaces(Web)的这些抽象类。这种方法使我们能够在所有这些平台上进行快速开发和轻松更改。 – zlaja 2012-07-17 22:28:35

回答

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"); 
相关问题