2011-01-05 16 views
3

faceletを使用してカスタムajaxyコンポーネントを作成します。デフォルトのコンポーネントから模倣したい動作の1つは、idはオプションであり、渡されない場合はidが生成されるということです。問題は、私はどこかにそのIDが必要な場合ということですfaceletコンポーネントの自動生成ID

public class JsfSupport { 

    public String generateId(String id) { 

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

} 

:私は支援方法を(だけでなくエル機能を使用することができます)を呼び出すのJBoss ELを使用し

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

を:私はすでに、このようにそれを行うことができますコンポーネントのjavascriptコードで、再度取得する必要があります。だから私は次のことができると思った:

<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は再生され、私は2つの異なる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

私はまったく同じ問題に直面している。このハンドラを使用するために必要なことをすべて説明してください。 –

関連する問題