投稿したフォームの値を書き込むためにTextFieldにモデルオブジェクトが必要なので、なぜあなたのTextFieldのモデルを切り離したいのかはわかりません。 PropertyModelからposition
をデタッチすると、ユーザーがフォームを送信した後にTextFieldに "title"値を書き込む場所がありません。 position
が何であるか、どこからロードされたのか、そしてリクエストサイクルの間にデタッチする必要があるのかについての詳細を提供したいかもしれません。一般的なプラクティスは、フォームコンポーネントがその値を書き込むための安全にシリアライズ可能なモデルオブジェクトを持つことです。
各リクエストの最後にPropertyModelのモデルオブジェクトをデタッチする必要がある場合は、PropertyModelをLoadableDetachableModelにチェーンします。 LDMは、提供されたload()
メソッドに基づいて、各要求サイクルごとに新しいモデルオブジェクトをロードし、そのモデルオブジェクトの参照を自動的に無効にして、モデルオブジェクトの直列化を防止します。 LoadableDetachableModel<Position>
をPropertyModelのモデルオブジェクトとして使用すると、PropertyModelによってLoadableDetachableModelが自動的に切り離され、position
オブジェクトのシリアル化が回避されます。
例のようなモデルでdetach()
を明示的に呼び出す必要はありません。 Wicketは、ページ階層内のすべてのコンポーネントのデフォルトモデルを自動的に切り離します。 「デフォルトモデル」とは、super(...)
チェーンを通過し、最終的にComponent(...)
コンストラクタの1つのmodel
引数になるモデルを意味します。
リクエスト処理の終了時に、ページは子供のdetach()
(およびその子どもはdetach()
を子どもに呼び出すなど)を呼び出します。このメソッド(Componentで定義されている)はdetachModels()
を呼び出し、Componentのデフォルトモデルを切り離します。
複数のモデルを共通に使用する標準のWicketコンポーネントは、detachModels
の間に追加モデルを切り離します。たとえば、DropDownChoiceを選択した値を取得または設定するモデルと選択肢のリストのモデルの両方を渡すと、DropDownChoiceは各要求の最後にこれらのモデルを自動的に切り離します。これは、AbstractChoice#detachModel()
が設定されている場合、choices
モデルを検索して切り離すためです。あなたはCompoundPropertyModelがdetachModels
によって自動的に切り離されることになる
Form<User> userForm = new Form<User>("userForm", new CompoundPropertyModel<User>(new DetachableUserModel(...));
があった場合例えばので
チェーンモデルも、彼らのチェーンモデルを切り離し、それは順番にDetachableUserModelを切り離します。
モデルを手動で切り離すことを心配する必要がある場合は、コード内にデフォルトの部品番号model
でない追加モデルを使用したり、別のモデルにチェーンしたりしない場合があります。これは、複数のモデルオブジェクトを持つ新しいタイプのComponentを作成する場合には問題になる可能性があります。あなたのケースでは
@Martinさらに、フォームがフィールドではない場合でも、ページに追加されます(その間に他のコンポーネントが1つ以上ある可能性があります)。そして、このページは確実にシリアル化されます。 – Nicktar
@Nicktar - 良い点。私はこれを組み込む答えを更新しました。 –