3
JSF 2.0:レンダリングされていないコンポーネントでJSF Beanを使用すると、そのコンポーネントが作成されるのはなぜですか?
<cc:implementation>
#{testBean.someField}
</cc:implementation>
それのためのBean:
public class TestBean {
private boolean someField = false;
public boolean getSomeField() { return someField; }
@PostConstruct
public void init() {
System.out.println("PostConstruct");
}
}
それから通常のように呼び出してください:
<codeEditor:test rendered="#{false}" />
コンポーネントは決してレンダリングされず、Beanは決して想定どおりに開始されません。
ただし、コンポーネントを次のように変更した場合:<cc:implementation>
<h:outputText value="#{testBean.someField}" />
</cc:implementation>
コンポーネントがまだレンダリングされないのは(rendered
属性がfalse
なので)、インスタンス化されます。これは、ある種のネイティブJSFコンポーネント(h:panelGroup
、h:inputHidden
など)内でBeanプロパティを使用すると常に発生します。
なぜそうですか?
ありがとうBalusC、私はそれが何か基本的なものだとはっきりとは分かっていませんでした。あなたが使用されていなくても、コンポーネントとBeanを作成するのに悪いと感じませんか? –
これは、複合コンポーネントではなくUIComponentsを使用する唯一の方法だと思います。 –
ちょうどこれをハックしようとしました。内容を初期化するかどうかによって、0-1要素のui:repeatを使用します。コンテンツを作成してはならないときは空のリストを返し、コンテンツが作成されレンダリングされるはずのリストの中に単一のダミー要素(何でも)を返すメソッドをバッキングに作成しました。それはコンポーネントツリーを少し膨らませますが、少なくとも基本的なケースではうまくいくはずです。 –