[Wicket-ja-user 670] Re: FeedbackPanel表示後、画面の部分更新が出来ない

Back to archive index

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




Wicket-ja-user メーリングリストの案内
Back to archive index