私のシナリオは次のとおりです。それぞれが複合コンポーネントとして3つのアドレスを持つフォームがあります。各アドレスには、他の2つのアドレスのいずれかからアドレスをコピーするためのリンクがあります。リンクはを介してターゲットアドレスと送信元アドレスを設定しf:setPropertyActionListener
、次にBeanメソッドを呼び出して、これらのパラメーターに基づいて実際のコピーを実行します。リンクにはf:ajax
、送信元アドレスのみを実行し、ターゲットアドレスをレンダリングするがあります。このようにして、ユーザーは、ページ上の他のアドレス(たとえば、コピー先のアドレス)に検証エラーがある場合でもコピーできます。ターゲットフィールドは潜在的に無効であるため(したがって、私の場合は赤でマークされています)、Ajaxリクエスト中に処理されないためp:resetInput
(Primefaces)を使用してリセットします。
これが私の問題でした。リセットは、無効なステータスとstyleClassを削除するという点で正常に機能します。フィールド自体は完全にきれいに見えます。ただし、添付したエラーメッセージは引き続き表示され、更新時にのみ表示されます。リセット+再レンダリングでこれを処理できると思いましたが、残念ながらそうではありません。
次の試みは、でメッセージのリストをクリアするようにcopyメソッドを拡張することでしたFacesContext
が、これは機能しません。実際にBeanメソッドに到達すると、現在のコンテキストが検証に合格したことを意味します( )の一部であるためexecute
、メッセージはありません。
したがって、問題は次のとおりです。未処理のコンポーネントの以前に添付されたメッセージにアクセスする方法はありますか?この答えに基づいて、私は次のようなことを考えています:
- ターゲットコンポジットを取得する
- その子供たちを横断する
- 各コンポーネントのメッセージを確認し、ある場合は削除します(方法はわかりませんが...)
しかし、多分私はこれを間違って考えています。メッセージがまだそこにあるのか、これが何らかのビュー更新の問題なのかわかりません。その場合、入力メッセージコンポーネントもリセットする方法を知る必要があります(現在、ターゲットとしてrender
囲みh:panelGroup
を使用しています。これは、入力の場合と同じように、asfaikがメッセージを適切に再レンダリングする必要があります...)
助けていただければ幸いです。
次の例に減らしました。
test.xhtml
<h:inputText id="string1" value="#{testBean.string1}" style="#{component.valid ? '' : 'background-color:red;'}">
<f:validateLength minimum="4" />
<f:ajax render="@this msg1" />
</h:inputText>
<h:message id="msg1" for="string1" />
<br /><br/>
<h:inputText id="string2" value="#{testBean.string2}" style="#{component.valid ? '' : 'background-color:red;'}">
<f:validateLength minimum="4" />
<f:ajax render="@this msg2" />
</h:inputText>
<h:message id="msg2" for="string2" /><br /><br/>
<h:commandButton actionListener="#{testBean.actionCopyString}" value="Click me">
<f:ajax execute="string1" render="string2" />
<p:resetInput target="string2" />
</h:commandButton>
TestBean
@ManagedBean(name = "testBean")
@ViewScoped
public class TestBean {
private String string1;
private String string2;
// + getters + setters
public void actionCopyString() {
string2 = string1;
}
}
行動
フィールド1に有効な文字列を入力してください(少なくとも4文字)。フィールド2に無効な文字列を入力し、タブをクリックするか、クリックしてください。フィールドが赤に変わり、メッセージが表示されます。次に、ボタンをクリックします。有効な値がコピーされます。フィールドのおかげで<p:resetInput>
、もう赤ではありません。ただし、メッセージは引き続き表示されます。それを属性に含めrender
たり、入力とメッセージの両方の周りにコンテナコンポーネントを再レンダリングしたりしても、効果はありません。私の目標は、コピー操作が終了した後にメッセージが消えるようにすることでもあります。