2011-01-05 1 views
3

우리는 facelets을 사용하여 사용자 정의 ajaxy 구성 요소를 만듭니다. 기본 구성 요소에서 모방하려는 동작 중 하나는 id가 선택적이며 id가 전달되지 않으면 id가 생성된다는 것입니다. 나는 이미이 맘에 수행 할 수 있습니다facelets 구성 요소의 자동 생성 ID

<ui:composition ...> 
    <div class="myComponent" id="#{jsfSupport.generateId(id)}"> 
    ... 
    </div> 
</ui:composition> 

을 나는 보스 엘이 지원 메소드를 호출 (뿐만 아니라 엘 기능을 사용할 수 있습니다) 사용

public class JsfSupport { 

    public String generateId(String id) { 

    if (id==null || "".equals(id){ 
    return FacesContext.getCurrentInstance().getViewRoot().createUniqueId(); 
    } 
    return id; 
    } 

} 

문제는 그 어디 선가 그 ID를 필요로하는 경우 구성 요소의 자바 스크립트 코드에서 다시 검색해야합니다. 그래서 나는 다음과 같이 할 수 있다고 생각했다 :

<ui:composition ...> 
    <c:set var="id" value="#{jsfSupport.generateId(id)}" /> 
    <div class="myComponent" id="#{id}"> 
    ... 
    </div> 
    <script type="text/javascript"> 
    document.getElementById('#{id}'); 
    </script> 
</ui:composition> 

그러나 그것은 작동하지 않는다. 어쨌든 ID는 재생성되고 두 개의 다른 ID를 얻습니다. 이 작업을 수행하는 가장 이상적인 방법은 무엇입니까?

+0

나는 당신이 생성 된 "ID"에 접근 할 방법에 대해 물어 수에서 :

한 번만 전달 된 표현식을 평가하고 반환 값을 절약 할 수 <c:set> 태그의 자신의 버전을 쓸 수 페이지에서 위의 Ajax 구성 요소를 포함/사용 했습니까? 예 : 사용자 정의 Ajax 구성 요소를 다시 렌더링해야하는 경우 어떻게 수행할까요? – bchetty

+1

@bchetty 당신은 할 수 없습니다. 다시 작성해야하는 경우 ID를 전달해야합니다. 자동 생성 된 ID는 구성 요소와 외부 상호 작용이없는 경우에만 해당됩니다. –

+0

빠른 응답을 보내 주셔서 감사합니다! :) – bchetty

답변

1

<c:set>은 Facelets에서 앨리어싱을 의미하며 JSP와 같은 할당이 아닙니다. 따라서 #{id}을 사용할 때마다 #{jsfSupport.generateId(id)} 번으로 전화가 걸려서 문제가 발생합니다.

public class SetOnceHandler extends TagHandler 
{ 
    private TagAttribute var; 
    private TagAttribute value; 

    public SetOnceHandler(TagConfig cfg) 
    { 
     super(cfg); 
     value = getRequiredAttribute("value"); 
     var = getRequiredAttribute("var"); 
    } 

    public void apply(FaceletContext ctx, UIComponent parent) 
    { 
     ctx.setAttribute(var.getValue(ctx), value.getObject(ctx)); 
    } 
} 
+0

이것은 완벽하게 작동합니다! 감사. 나는 이것에 대한 특별한 일이 없다는 것에 놀랐다 ... –

+0

나는 또한 똑같은 문제에 직면하고있다. 이 처리기를 갖기 위해 필요한 모든 것을 설명해 주시겠습니까? –