2012-04-16 5 views
1

AJAX 클라이언트 동작을 포함하는 구성 요소를 개발 중입니다. 동작은 구성 요소에 제공된 매개 변수 (예 : 렌더링 및 실행 대상)에 따라 다릅니다. 성능상의 이유로 Facelet 기반 복합 컴포넌트를 사용하여 컴포넌트를 구현하고 싶지 않습니다.JSF : ClientBehavior를 구성 요소에 추가 할 때

제 질문은 클라이언트 동작이 구성 요소에 추가 될 때입니다. encodeBegin() 메서드에서 addClientBehavior()으로 전화하면 이 UIComponentBase.restoreBehaviorsState()으로 수신됩니다. 생성시 동작을 추가하면 Ajax 요청이 작동하지만 매개 변수는 아직 사용할 수 없습니다. 제대로 작동을 추가 할 때 적절한 방법이나 이벤트가 있습니까?

mojarra 2.1.7을 사용합니다. 다음은 동적 아약스 물건없이 내 구성 요소에 대한 간단한 예입니다 : 어떤 도움

@FacesComponent(value="simpleTestLink") 
public class SimpleTestLink extends HtmlCommandLink{ 


    private Logger logger=LoggerFactory.getLogger(getClass()); 
    private AjaxBehavior ajax; 

    enum PropertyKeys{aProp}; 

    public SimpleTestLink() { 
     logger.debug("SimpleTestLink created"); 
     // adding ajax here works, but no parameters available yet 
     ajax = new AjaxBehavior(); 
     ajax.setExecute(Arrays.asList(new String[]{"@this"})); 
     ajax.setRender(Arrays.asList(new String[]{"@form"})); 
     addClientBehavior(getDefaultEventName(), ajax); 

    } 

    @Override 
    public void encodeBegin(FacesContext context) throws IOException { 
     logger.debug("encodeBegin num: " + getAttr()); 
     // adding ajax here fails 
     super.encodeBegin(context); 
    } 

    @Override 
    public boolean getRendersChildren() { 
     return true; 
    } 

    @Override 
    public void encodeChildren(FacesContext context) throws IOException { 
     Object attr = getAttr(); 
     HtmlOutputText outputText = new HtmlOutputText(); 
     outputText.setValue("testlink["+ attr+"]\n"); 
     outputText.encodeAll(context); 
     super.encodeChildren(context); 
    } 

    private Object getAttr() { 
     return getAttributes().get(PropertyKeys.aProp.name()); 
    } 

} 

감사합니다, 예, '적절한 방법 또는 이벤트'PreRenderViewEvent라고

답변

관련 문제