2012-07-16 3 views
1

우리는 PrimeFaces 3.3.1, Mojarra 2.1.10 및 Tomcat 7.0.26을 사용합니다.Primefaces tab 변경 알림

응용 프로그램의 모든 구성 요소는 프로그래밍 방식으로 만들어지고 페이지의 루트 구성 요소 만 바인딩됩니다. 이 페이지입니다 - 템플릿의 일부 - 루트 구성 요소에 바인딩, 패널 인 RootPanel라고 :이 방법을 tabChanged있다

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); 

: 우리가 프로그래밍 TabView의 컴포넌트를 생성하는 방법이있다

<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> 

을 :

public void tabChanged(TabChangeEvent event){ 
    requestPartialRendering(); 
} 

위의 MethodExpression에 지정된 메소드 tabChanged는 탭 변경시 절대로 호출되지 않습니다. 탭 변경시 호출 할 메서드를 지정하는 올바른 방법입니까? 탭에서 호출 할 빈 메소드를 변경하는 방법은?

+0

프로그래밍 구성 요소를 생성하기위한 어떤 특별한 이유가 있습니까? – siebz0r

+0

예, 그렇습니다. 우리는 ERP 시스템을 구축하고 있습니다. 우리는 레이아웃, 컴포넌트의 팩토리 메소드 등을 지정하는 추상 클래스를 사용합니다. Swing, Android, PrimeFaces (Web) 등 다양한 플랫폼을위한 추상 클래스를 확장하는 특정 클래스도 있습니다. 이러한 접근 방식을 통해 우리는 이러한 모든 플랫폼에서 신속하게 개발하고 쉽게 변경할 수 있습니다. – zlaja

답변

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");