2011-11-02 2 views
6

私は多くのTextField入力コンポーネントを含むwicketフォームを持っています。これらの入力の大部分にはバリデーターが添付されています。フィードバックエラーを返すことはできますが、Wicketはコンポーネントモデルを更新できますか?

50個の値を入力し、そのうちの1つが範囲バリデータに失敗したとします。 Wicketはエラーフィードバックメッセージを生成しますが、各コンポーネントに関連付けられたモデルも更新しません。結果は、入力したばかりの50個の値がすべて失われ、再度入力する必要があります。

私の質問は、有効な値を持つコンポーネントのモデルを更新するようWicketに伝えることができますが、不正な値についてエラーを報告するだけですか?

フレームワークを掘り下げて見ると、FormComponentのこのコード部分に気付きました。これは、エラーがあれば、モデルを更新しないことを示しているようです。

public final void processInput() 
{ 
    inputChanged(); 
    validate(); 
    if (hasErrorMessage()) 
    { 
     invalid(); 
    } 
    else 
    { 
     valid(); 
     updateModel(); 
    } 
} 

この動作をカスタマイズしてすべての有効な値を保持する目的はありますか?

+1

どのバリデーターを使用していますか?検証エラーがあっても、ユーザーの入力を保持する必要があります。これらのバリデータの1つを表示して、FormComponentsにどのように添付されていますか、フォーム提出の処理方法を教えてください。 –

答えて

7

私はFormComponent.processInput()がここでは全く呼び出されていないと思います。 Formを送信すると、Form.process()が呼び出されます。そこで、それはForm.validateComponents()を呼び出し、最後にFormComponent.validate()を使用してForm.validate()と呼びます。

ここで問題になっているのは、グローバル処理がForm.process()です。フォームは完全に提出するか、まったく提出しません。 FormComponent.validate()が失敗した場合、Form.hasError()trueを返します。したがって、Form.process()はいずれのモデルも更新しません。

あなたは可能性:FormValidator

  • 移動全てFormComponent独立した検証を。そこでは、その検証をパスしたモデルFormComponentsのモデルを更新することができます。
  • Form.onError()を実装し、訪問者を使用して有効なモデルFormComponentsを更新してください。
  • Form.process()をオーバーライドし、// If a validation error occurredブランチを変更して、FormComponentのエラーに応じて、独自のメソッドを使用してコンポーネントを有効/無効とし、モデルオブジェクトを更新するかどうかを指定します。特定のFormComponentで検証が失敗した場合は、FormComponent.hasErrorMessage()が通知します。

UPDATE

ユーザ入力はOPで失われた理由を議論した後、それはFormComponentstruesetReuseItems設定されていませんでしたListViewに追加されていたことが判明しました。これにより、FormComponentsがそれぞれListView.populateItem()に新たに作成され、すべてのユーザー入力が失われていました。この問題の性質上

詳しい情報はhereを見つけることができます:

しかし、あなたが 形式でリピータを使用した場合の世話をする必要がありますいくつかの規定があります。通常、リピーターは、 のリクエストの開始時にアイテムをクリアします。フォーム内では、 が望ましくありません。これは、古いアイテムを保存したいからです。 は新しく再作成されるのではなく、状態を維持します。

たとえば、ListViewを使用する場合は、常に ListView.setReuseItems(true)を呼び出して、常に新しいものを作成するのではなく、古い アイテムを保持するようにしてください。

+0

ここのページはDynamicWizardStepだと言わざるを得ない。 –

+0

私はウィザードを使用していませんが、それは違いがないと思います。とにかく「

」で囲まれますね。 –

+0

はい、それはXaviになりますが、私はDynamicWizard(wicket拡張機能)を使用する意向です。 –