これは、rendered
falseの場合、コンポーネントは表示されませんが、ビューのコンポーネントツリーにはまだ存在していることが原因です。したがって、コンポーネントは表示されませんが、その値と状態はまだ存在しています。
これを回避する方法はいくつかあります。
<c:if />
の代わりに(可能であれば)などのJSTLタグを使用しますrendered
。タグ内のページ要素<c:if/>
は、条件が真の場合にのみツリーに含まれます。
あるサブビューから別のサブビューに移るときは、ポストバックを行わないでください。これにより、ツリーが最初から効果的に再作成されます。たとえば、POSTの代わりにGETを実行します。
ビューを無効にして、ツリーが再作成されるようにします。サブビューcommandButton
を切り替えるを作成immediate="true"
し、次のコードを追加してビューを無効にします。
public void clearComponentTree() {
FacesContext context = FacesContext.getCurrentInstance();
Application application = context.getApplication();
ViewHandler viewHandler = application.getViewHandler();
UIViewRoot viewRoot = viewHandler.createView(context, context.getViewRoot().getViewId());
context.setViewRoot(viewRoot);
context.renderResponse();
}
- コンポーネントツリーを直接操作して、不要なコンポーネントを削除します(上記と同様ですが、特定のコンポーネントに限定されます)。ここでは、idを持つサブビューの下のすべてのコンポーネントを削除したいと仮定します
sub1
(これも必要immediate="true"
です):
public void clearSubtree() {
FacesContext context = FacesContext.getCurrentInstance();
context.getViewRoot().findComponent(":sub1").getChildren().clear();
}
このリンクは、これを達成するための他のマイナーな方法を提供します。