0

2つのサブビューを含むJSFページがあります。実行されるcommandButtonに応じて、サブビューの1つがレンダリングされます。ただし、サブビューの1つで検証が失敗した場合、エラーメッセージは表示されたままになり、次にサブビューがレンダリングされたときにコンポーネントは無効のままになります。Beanでメッセージを削除するための回避策がありますが、コンポーネントは無効のままです。コンポーネントを有効として設定したり、サブビューのみの新しいビューを作成したりする方法はありますか?

メッセージの回避策は次のとおりです。

Iterator messageIterator = FacesContext.getCurrentInstance().getMessages();
    while (messageIterator.hasNext()) 
    {
            messageIterator.remove();
    }
4

2 に答える 2

1

これは、renderedfalseの場合、コンポーネントは表示されませんが、ビューのコンポーネントツリーにはまだ存在していることが原因です。したがって、コンポーネントは表示されませんが、その値と状態はまだ存在しています。

これを回避する方法はいくつかあります。

  • <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();
}

このリンクは、これを達成するための他のマイナーな方法を提供します。

于 2012-10-17T18:35:52.227 に答える
0

入力の状態を再確立するには、primefaces 拡張: resetInputを使用してみてください。

<p:commandButton value="Load Subview" action="#{bean.startSubview}" update="subview" process="@this" >
    <pe:resetInput for="subview"/>
</p:commandButton>
于 2012-11-08T00:53:57.273 に答える