[Seasar-user:15956] Re: [Teeda] forEachによる繰り返しをJavascriptで追加・削除した場合
Koichi Kobayashi
[E-MAIL ADDRESS DELETED]
2008年 10月 9日 (木) 16:00:29 JST
小林 (koichik) です.
Date: Wed, 08 Oct 2008 20:20:33 +0900
From: Koichi Kobayashi <[E-MAIL ADDRESS DELETED]>
To: [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:15952] Re: [Teeda] forEachによる繰り返しをJavascriptで追加・削除した場合
> xxxItems の要素を削減するようにしました.
>
> 副作用として,表示専用に使っていた xxxItems は
> xxxItemsSave や @PageScope 等で保存していても
> サイズは 0 になってしまったりします.
> 繰り返しにチェックボックスしかない場合と同様,
> hidden を埋めておけば問題ないのですが,注意が
> 必要です.
こちらでもいくつか試したのですが,この副作用の
影響が大きすぎるので,この修正はなかったことに
させてください.
オプションにしても xxxItems ごとに指定できないと
厳しいと思う.
回避策ですが,次のようにすればなんとかなるかと
思います.
public List<Foo> xxxItems;
public int xxxIndex;
public int xxxSize;
public String aaa; // これは Foo のプロパティとする
public String getExist() {
return "1";
}
public void setExist(String s) {
xxxSize = xxxIndex + 1;
}
HTML で
<tbody id="xxxItems">
<tr>
<td>
<input type="text" id="aaa"/>
<input type="hidden" id="exist"/>
...
例えば最初に 3 行表示されていて 1 行削除し,
name 属性を整理してサブミットすると,
form:xxxItems:0:aaa=xxx
form:xxxItems:0:exist=1
form:xxxItems:1:aaa=zzz
form:xxxItems:1:exist=1
となり,xxxItems のサイズは 3 のままですが,
forEach の数としては 2 になるので,
xxxIndex が 0 と 1 の時しか setExist() は
呼ばれません.
# バリデーションも 0 と 1 の時しか行われません.
do〜() メソッドで xxxSize をチェックして,
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 メーリングリストの案内