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