2012-02-20 11 views
2

レンダリング中に子コンポーネントを追加することはできますか? JSF 1.2環境で子コンポーネントを動的に追加するベストプラクティスは何ですか?ありがとうレンダリング時にJSFコンポーネントを挿入/追加する

+0

具体的な例がありますか? –

+0

基本的には、変数をとるコンポーネントを作成してブール値としましょう。真であればコンポーネントの中に子入力を追加したいので、入力を使ってdiv内に入るようにしますレンダラクラスにレンダリングするのではなく、レンダラクラスを使用します。 –

+0

Seamでやるのは簡単ですが、jsfだけでは100%ではないことがわかります。これを試してみてください。http://www.coderanch.com/t/212933/JSF/java/if-like-JSF-conditions、それはひどいかもしれないpanelGroupに言及しています –

答えて

1

あなたが行うことができるより良い場所はPhaseListenerの実装です。例えば

ビューのルートへの新しいコンポーネントを追加する方法を次のコードスニペットのサンプル:

public class ViewModifierPhaseListener implements 
     javax.faces.event.PhaseListener { 

    @Override 
    public void afterPhase(PhaseEvent event) { 
    } 

    // Just sampling add component on ViewRoot 
    @Override 
    public void beforePhase(PhaseEvent event) { 
     // Gets the target component from ViewRoot 
     UIViewRoot viewRoot = event.getFacesContext().getViewRoot(); 
     UIComponent parent = viewRoot.findComponent("parentComponentId"); 
     // UIComponents to create depend on JSF implementation, 
     // Try to use the available factories when suplied by the implementation 
     UIComponent child = Factory.getComponent("ComponentClassName"); 
     // Customize the component, for instance it has to be disabled 
     child.getAttributes().put("disabled", true); 
     // Adds the fresh created component to the parent 
     parent.getChildren().add(child); 
    } 

    @Override 
    public PhaseId getPhaseId() { 
     return PhaseId.RENDER_RESPONSE; 
    } 
} 

を使用すると、コンポーネントツリーを持っているという段階にあるため、getPhaseIdがRENDER_RESPONSEフェーズを返すことに注意してくださいは、コンプリート。

<lifecycle> 
    <phase-listener>your.package.ViewModifierPhaseListener</phase-listener> 
</lifecycle> 

それとも、Faceletsをして作業する場合、あなたがしたいページのテンプレートで定義することができます:

あなたの位相リスナーの定義は次のように顔-config.xmlののライフサイクルの要素に設定する必要がありますリスナーの影響を受けます。これにより、PhaseListenerをいつ実行するかを区別するのに役立ちます。

<f:phaseListener type="your.package.ViewModifierPhaseListener"/> 
関連する問題