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