- 2008年12月23日 00:51
- しらべる
mayaaを使ってみて実感した一番こまるのはm:idやm:xpathに変数が使えないこと。
たとえば、
<div id="pref"> <table> <tr> <td><input type="checkbox" /> 北海道</td> <td><input type="checkbox" /> 青森県</td> <td><input type="checkbox" /> 秋田県</td> <td><input type="checkbox" /> 岩手県</td> <td><input type="checkbox" /> 山形県</td> </tr> <tr> <td><input type="checkbox" /> 宮城県</td> <td><input type="checkbox" /> 福島県</td> //(以下略)
とあり、DB項目から抽出した都道府県情報
List<Map> prefectureList
があったとすると、
forでまわして、プロセッサ一発でセットしたいというのが人情というもの。
感覚的にはもう、こうしたくて仕方ない。むりだけど。
<!-- 当然エラー -->
<m:for init="${ var i = 0 }"
test="${ i < prefectureList.size() }"
after="${ i++ }" >
<m:echo m:id="${cb + i}">
<m:attribute name="name" value="prefId" />
<m:attribute name="value" value="${prefecture.get('prefId')}" />
</m:echo>
</m:for>
テンプレートにはできるだけ手を入れたくないのだけど、しかたなく、inputタグにid(cb0,cb1,cb2,,,)を付けて、m:echoでidを参照しようかと思って以下にしても
<m:with m:xpath="//div[@id='pref']/table/tr/td/input[@type='checkbox']">
<m:forEach items="${prefectureList}" var="prefecture" index="i">
<m:echo>
<m:if test="${id == 'cb' + i}">
<m:attribute name="name" value="prefId" />
<m:attribute name="value" value="${prefecture.get('prefId')}" />
</m:if>
</m:echo>
</m:forEach>
</m:with>
idを参照できるためにはecho内部にifを書く必要があるけど、
echoを先に書いたら、マッチしないのに出力されてしまう。。。
もどかしすぎる!!!
そんなとき、ふとひらめいた。
xpathで指定したので、同時に一括処理されるのかと思ったのだけど、中で変数をカウントアップしたら
ちゃんと対象タグの数だけ処理が走っていました。
つまり、、
<m:beforeRender><![CDATA[
var cbcount = 0;
]]></m:beforeRender>
<m:with m:xpath="//div[@id='pref']/table/tr/td/input[@type='checkbox']">
<m:echo>
<m:attribute name="name" value="prefId" />
<m:attribute name="value" value="${prefectureList.get(cbcount).get('prefId')}" />
</m:echo>
<m:exec script="${cbcount++}" />
</m:with>
タグカウント用の変数でList出力するようにしたらうまく行きました。ただし、タグの順番とListの順番が同じになってる必要がありますけど。テンプレートにもノータッチ。おっしゃ!
