Top | 戻る
If
JSP のような感覚でデータに応じたレイアウトを展開するのに、データバインディングは欠かせません。
大雑把なレイアウトは、mx:State も利用できますが、
細かな制御には限界があります。
レイアウト制御といえば、まずは条件分岐ですが該当するタグはありません。
次に反復。 こちらは、 JSP でおなじみの c:forEach, nested:iterate
に担当する、 mx:Repeater があります。
では、条件分岐はどうするのでしょう?
ループタグはあるのに、 c:if のようなタグが無い・・・?
答えは意外と簡単。
ループタグを、ループ 0回 or 1回 で使えばよし。
mx:Repeater の dataProvider 属性に、 {new Array(test? 1 : 0)} を指定します。
'test' は、任意の条件式です。
mx:Repeater を継承して c:if や c:choose の代替を作ってもよさそう。
(本家から mx:if や、 mx:choose が提供されるのが理想ですが。)
サンプルでは、 mx:Repeater を条件分岐,反復、両方の目的で使用して、
行を動的にグループ化した表組みデータを表示しています。
mx:Repeater を入れ子にして複雑なレイアウトを作ると、
データバインディングのイベントが効かなくなることがあります。
そんな時には mx.core.UIComponent#executeBindings() で締めます。
Main.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
[Bindable]
private var listData : XMLList = <>
<item name="和食">
<item name="そば"/>
<item name="うどん"/>
<item name="焼魚"/>
</item>
<item name="中華">
<item name="餃子"/>
</item>
<item name="洋食">
<item name="ハンバーグ"/>
<item name="シチュー"/>
</item>
</>;
]]>
</mx:Script>
<mx:Style>
.cell1 {
background-color : #f0f0f0;
vertical-align : middle;
}
</mx:Style>
<mx:Grid>
<mx:Repeater id="outerList" dataProvider="{listData}">
<mx:Repeater id="innerList" dataProvider="{outerList.currentItem.item}">
<mx:GridRow>
<mx:Repeater dataProvider="{new Array( (innerList.currentIndex == 0)? 1 : 0)}">
<mx:GridItem styleName="cell1" rowSpan="{outerList.currentItem.item.length()}">
<mx:Label text="{outerList.currentItem.@name}"/>
</mx:GridItem>
</mx:Repeater>
<mx:GridItem styleName="cell1">
<mx:Label text="{innerList.currentItem.@name}"/>
</mx:GridItem>
</mx:GridRow>
</mx:Repeater>
</mx:Repeater>
</mx:Grid>
</mx:Application>
実行結果
Contents Copyright © Kazuhiko Arase