2

私のシナリオは次のとおりです。それぞれが複合コンポーネントとして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たり、入力とメッセージの両方の周りにコンテナコンポーネントを再レンダリングしたりしても、効果はありません。私の目標は、コピー操作が終了した後にメッセージが消えるようにすることでもあります。

4

1 に答える 1

2

解決しました。BalusCのコメントによると、メッセージタグの使用<p:resetInput> 再レンダリングは、それ自体で完全に機能します。

間違いは私たちのセットアップの奥深くにありました。プロジェクトが開始されたとき、元同僚によって設定されたUIフレームワークとしてIceFacesを使用していました。要件の変更により、最近PrimeFacesに切り替えました。私の知る限り、IceFaces jarとインクルード、および削除されていないものへのすべての参照-しかし、今日、私は、IceFacesを参照するいくつかの設定を見つけました。したがって、SVNを介した配布により、すべてのマシンは、実際にライブラリを使用しているページがなくても、ライブラリをバックグラウンドで実行していることがわかりました。

どうやら、IceFacesの生成された出力の一部はPrimeFacesの出力と衝突します(おそらくいくつかのJavaScriptとテーマ関連のstyleClassesを経験した効果から)。現在、私のページのいくつかのスタイルは少し奇妙に見えますが、p:resetInput突然意図したとおりに機能します。また、これまでまったく機能していなかった他のコンポーネント(p:growlたとえば)もあります。

これはちょうど私の日を作りました!私は本当に何が起こっているのかもう手がかりがありませんでしたが、これは私の最も神秘的なバグの4つを一度に修正しました...イェーイ!

BalusCをご覧いただきありがとうございます。ここでのあなたの努力に本当に本当に感謝しています。私はいつも私の質問に対するあなたの答えが大きな助けになると思っています。さらに、他の人の質問に対する何十もの答えが私を推測することから救い、物事を行う方法の良い例を提供しました。巨大な距離-抱擁!

于 2012-11-14T17:42:53.943 に答える