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

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2009年 3月 19日 (木) 16:00:55 JST


小林 (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 メーリングリストの案内