2012-10-16 2 views
1

rich : dataTable 렌더러를 확장하여 일부 기능을 추가하려고합니다. 좀 더 구체적으로 말하자면 ijax 호출을 트리거하는 헤더 열에 링크를 렌더링하여 백킹 빈에서 액션을 트리거하고 싶습니다.구성 요소 렌더러에서 a4j : commandLink를 동적으로 만드는 방법은 무엇입니까?

필자는 dataTable의 렌더러를 수정하여 a4j : commandLink 인스턴스를 인스턴스화하고 추가하는 것이 주된 생각이었습니다. 일부는 작동하지만 링크는 올바르게 렌더링되지만 연결된 액션은 호출되지 않고 추가 된 매개 변수 assignemnt가 수행되지 않습니다. 또한 실제로 볼 수있는 부분을 실행하고 렌더링 할 수 없습니다. 설정 한 값이 무시되는 것처럼 보입니다. 예를 들어 @all을이 두 속성의 값으로 지정하면 여전히 부분 응답을 포함합니다. 내 페이지의 아주 작은 부분).

내가 링크를 만드는 데 사용하는 코드입니다 :

UICommandLink l = (UICommandLink) context.getApplication().createComponent(UICommandLink.COMPONENT_TYPE); 
l.setTransient(false); 
l.setRender("@all"); 
l.setExecute("@all"); 
l.setActionExpression(ULHelper.createMethodExpression("#{orderBy.toggle('"+ sortName + "')}", null, String.class); 
l.setParent(uiColumn); 
l.getChildren().add(headerFacet); 
l.encodeAll(context); 

uiColumn UIColumn의 인스턴스 인을 headerFacet 링크 내에서 렌더링해야 할 텍스트입니다.

링크가 올바르게 표시되면 링크를 클릭하면 자바 스크립트 콘솔에 오류가 표시되지 않지만 AJAX 요청이 트리거됩니다.하지만 서버 측에서 다음에 어떤 일이 발생하는지 전혀 알지 못해 동작이 호출되지 않습니다. 테이블이 다시 렌더링되지 않습니다. 난 액션 리스너

l.addActionListener(...); 

추가 또는 링크는 차이가 없습니다

UIParameter par = (UIParameter) context.getApplication().createComponent(UIParameter.COMPONENT_TYPE); 
par.setValue(sortName); 
par.setAssignToExpression(ULHelper.createValueExpression("#{bean.text}", String.class)); 
l.getChildren().add(par); 

에 파라미터 인스턴스를 추가하면

는 이들의 어느 쪽도 실행된다.

a4j : commandLink가 저장되지 않아 두 번째 요청에서 해당 링크 (따라서 리스너, 매개 변수 등)가 작동하지 않는다고 생각됩니다. 하지만 링크의 상태를 지속 (및 복원)하는 방법을 모릅니다. 도움이 될 수있는 작업 소스에서

답변

0

그냥 샘플 :

import org.ajax4jsf.component.html.HtmlAjaxCommandLink; 

    public UIComponent ajaxLink(...) { 
     HtmlAjaxCommandLink ajaxLink = new HtmlAjaxCommandLink(); 
     ajaxLink.setId(...); 
     ajaxLink.setValue(...); 
     ajaxLink.setAjaxSingle(true); 
     ajaxLink.setOncomplete(...some js func..); 
     ajaxLink.setReRender(...); 
     FacesContext context = FacesContext.getCurrentInstance(); 
     MethodExpression actionListenerExpression = context.getApplication().getExpressionFactory().createMethodExpression(context.getELContext(), "#{someSeamComponent.someAction}", null, new Class[]{ActionEvent.class}); 
     MethodExpressionActionListener actionListener = new MethodExpressionActionListener(actionListenerExpression); 
     ajaxLink.addActionListener(actionListener); 
     return ajaxLink; 
    } 

uiComponent.getChildren().add(ajaxLink(...)); 
관련 문제