[Seasar-user:17094] Re: [Teeda]xxxItemsにJavaScriptで行追加後、バリデーションエラーが発生すると追加した行がなくなる

浅野護 [E-MAIL ADDRESS DELETED]
2009年 3月 22日 (日) 12:33:14 JST


浅野です。お世話になります。

返信ありがとうございました。

結局、クライアント側でもバリデーションを行うことを検討しているのですが、KumuのValidatorの動作について教えてください。
KumuValidatorConfで設定したバリデーションが実行されるタイミングは、(サブミット時ではなく)各項目に値が入力されたタイミング(?)と認識しています。
バリデーションのコールバック関数を設定し、エラー時にはalert文で、エラーメッセージを表示しようとしたのですが、1つのバリデーションチェックが実行されると、まだ未入力の他の項目のバリデーションチェックも実行されます。
よって、まだ未入力項目のエラーメッセージダイアログも表示されてしまうので、この回避策を調査しています。

例えば以下のようなことは可能でしょうか?
・入力した項目だけをバリデーションチェック実行する。
もしくは
・サブミット時にバリデーションチェック実行する。

よろしくお願いいたします。


2009/03/19 16:00 Koichi Kobayashi <[E-MAIL ADDRESS DELETED]>:

> 小林 (koichik) です.
>
> Date:    Thu, 19 Mar 2009 12:04:53 +0900
> From:    浅野護 <[E-MAIL ADDRESS DELETED]>
> To:      [E-MAIL ADDRESS DELETED]
> Subject: [Seasar-user:17079]
> [Teeda]xxxItemsにJavaScriptで行追加後、バリデーションエラーが発生すると追加した行がなくなる
>
> >
> 一覧に表示されているxxxItemsに対し、JavaScriptで行追加した後、登録などのdoメソッドでバリデーションエラーが発生すると、xxxItemsのサイズは元の状態に戻ります。
>
> do〜() メソッドが呼ばれた場合,Teeda としては
> バリデーションは終わっており,その後の描画は入力時の
> 状態ではなく,ページクラスの状態で描画されます.
>
> >
> 例えば、テキストフィールドなどに値を入力し、バリデーションエラーが発生しても、入力した値は保持されて再描画されるので、xxxItemsも変更が保持されるのかと思っていたのですが、これは仕様でしょうか?
>
> 実際には,xxxItems はサブミット時の状態を維持しています.
> サブミット時の状態というのは,xxxItemsSave によって
> 保持されている値であり,JavaScript で追加された
> 情報は反映されていません.
> JavaScript が追加する <input> や <select> 等は
> xxxItems そのものではないことに注意してください.
> それらは xxxItems の子コンポーネントに反映されます.
>
> xxxItems 自体に JavaScript で追加された情報が
> 反映されるのは UPDATE_MODEL_VALUES フェーズであり,
> これはバリデーションエラーが発生すると実行されません.
>
> http://teeda.seasar.org/ja/extension/concept/lifecycle.html#JSFライフサイクルとの関係
>
> このため,xxxItems はサブミット時の状態すなわち
> 前の描画時の状態 (JavaScript により追加される
> 行を含まない状態) のままとなります.
>
> > 仕様の場合は、xxxItemsの変更を保持する方法はないでしょうか?
>
> 実際にはバリデーションでエラーになった場合でも
> xxxItems に JavaScript による変更を反映させる方法と
> いうことになりますが,いい方法が思いつきません.
> 他の方はどうやってるんでしょうね?
>
>
> 無理矢理な案としては,xxxItems のサイズをあらかじめ
> 増やしておくというのが考えられます.
> 少々面倒ですが,xxxItems の要素である Dto に
> 有効/無効を表すフラグを持たせて,
> # ページクラスにも必要です.
>
> public class XxxDto {
>  public boolean enable;
>  ...
> }
>
> xxxItems は実際に追加されうる上限のサイズになるように
> 予備の XxxDto を持たせます.
> 例えば最大 100 件まで増やせるなら,描画時には
> 10 件しかなくても xxxItems の要素数は 100 に
> なるように,予備の XxxDto を入れておきます.
> ただし,予備の XxxDto の enable フラグは false にします.
>
> HTML では,enable が false の場合は描画しないように
> します.
> また,enable を隠しフィールドに持たせます.
>
> <input type="hidden" id="xxxItemsSave" />
> <div id="xxxItems">
>  <input type="hidden" id="enable" />
>  <div id="isEnable">
>    ...
>  </div>
> </div>
>
> JavaScript で行を追加する際,enable の value は
> true にします.
>
> これでバリデーションエラーが発生した場合でも
> xxxItems は上限分のサイズを持っているので,
> 追加された行の分も描画されます.たぶん.
> 実際には試していないのでまずいところがあるかも
> しれませんが.
>
>
> 実際の案件で使ってる人の方がいい案を持ってるかも
> しれません.なにかあれば自分も知りたいです.
>
>
> --
> <component name="koichik">
>    <property name="fullName">"Koichi Kobayashi"</property>
>    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
>    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
> </component>
>
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://ml.seasar.org/archives/seasar-user/attachments/20090322/a3232db5/attachment.html>


Seasar-user メーリングリストの案内