Tsutomu YANO
t_yano****@me*****
2012年 8月 19日 (日) 22:38:18 JST
矢野です。 記憶ベースで、実際のコードで試してませんが、たしかTextFieldは、内部に「ユーザの入力値」を意味するフィールドをキャッシュとして持っていて、エラーが発生して以降は、常にキャッシュを表示する仕組みだったと思います。 これは、エラーの時にモデル値を表示すると、ユーザの入力値が画面上から消えてしまい、ユーザにとって「何が間違ってたのか」が分からなくなってしまうのを回避するためのものです。 キャッシュを破棄するのは、コンポーネントのモデル値が変わったと「コンポーネント自身が」知ったときです。これは主にsetModelあるいはsetModelObjectによって行われるんですが、PropertyModelやCompoundPropertyModelを使ってる時にバックエンドのフィールドを直接書き換えた場合は、setModelObjectが呼ばれませんので、コンポーネントから見ると、モデル値が変わったことを知ることが出来ません。 で、そのためにmodelChangingとmodelChangedがあって、これを明示的に呼び出すことで、コンポーネントはモデルの変更を知ることができるわけです。 今回のケースでは、エラーをFeedbackPanelに表示して以降に発生するということですので、上記ケースにはまってるのではないかと推測します。 ちなみに、この、「フィールドが変わったのを各コンポーネントに通知する方法がない」というのが問題ということで、Wicket 1.5ではイベントシステムが導入されたのです。フィールド変更時にページに対してイベントを投げると、各コンポーネントのonEventが呼び出されるので、イベント種別が対象フィールドの更新であればモデル値の更新処理を行う、ということができます。 フィールド側はただイベントを投げるだけ、あとはコンポーネント側で勝手に判断してください、という仕組みを作ることができるわけです。 Wicket 1.4までは、フィールドを更新したらmodelChangingとmodelChangedを取りあえず呼んでおく、というバッドノウハウがありました…(常に呼ぶ必要があるわけではないんですが、呼ぶべき時が分かりにくいので、とりあえず呼んでおけ、みたいな感じです)。 On 2012/08/16, at 14:21, yoshiro_hagiy****@mnec***** wrote: > > > 自己レスです。 > > AjaxEventBehaivor("onClick")から、下側に配置したFormのデータ更新時に、 > modelChanging()と、modelChanged()をコールすることで更新するようになりま > した。 > > この方法でいいのかわかりませんが、動作するようになりました。 > > _______________________________________________ > Wicket-ja-user mailing list > Wicke****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user