• Date:2009/12/18
  • Category:Flex
  • Author: wonder

以前から謎だったArrayとArrayCollectionの違いについて調べてみます。
違いというかArrayCollectionって何っていう感じでしょうか。
これはXMLListCollectionにも言えますが。

コレクションについて

あえず、ArrayCollectionやXMLListCollectionってなんだろうということですが、Flexのヘルプに書かれていました。

コレクションは、Array や XMLList オブジェクトなどのデータソースオブジェクトに格納されたデータにアクセスしたり、このようなデータを表現したりするための一貫した方法を提供するオブジェクトです。コレクションにより、Flex コンポーネントと、そのコンポーネントの生成に使用するデータオブジェクトのと間に抽象レベルが提供されます。

ということみたいです。
ArrayやXMLListというのは通常のデータ(元となるデータ)。で、コレクションっていうのはそのデータのラッパーオブジェクトっていうことですね。
元データ色々な機能を追加したオブジェクトっていうことでしょうか。
追加される機能としては、以下のものになります。

  • 生データソースにより提供される処理から独立した一貫したデータ処理セットを提供します。
  • 基になるデータが変化したときに、コンポーネントが適切に更新されます。
  • リモートデータソースから到達するページングデータを処理するためのメカニズムを提供します。
  • ソートしたデータや開発者の提供するメソッドによってフィルタしたデータを表す具体的な「ビュー」を提供します。
  • 1 つのコレクションを使用して、同じデータソースから複数のコンポーネントにデータを格納できます。
  • コレクションを使用することで、コンポーネントのデータソースを実行時に切り替えることができます。また、データソースの内容を変更して、そのデータソースを使用するすべてのコンポーネントに変更を反映することもできます。
  • コレクションのメソッドを使用して、基になるデータソース内のデータにアクセスできます。

ヘルプより抜粋)
いろいろな機能がありますね。
その中でも重要な点をピックアップしました

基になるデータが変化したとき、コンポーネントが適切に更新される

ここが実は重要で、DataGrid等のデータにArrayやXMLListを使わないほうが良い理由でもあります。

まず、ArrayCollectionを使用した場合。
ArrayCollectionが持っている要素の追加・削除メソッドを使ってコレクションを変更できます。
そして、DataGridもあわせて変化します。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="init()" pageTitle="要素の追加・削除:コレクション">
<mx:Script>
<![CDATA[
    import mx.collections.*;
    import mx.controls.Alert;
    // 元となるデータを作成
    private var def_array:Array = [
        {name:'suzuki',money:500,number:1},
        {name:'sato',money:300,number:2}
    ];

    // データをバインドさせる
    [Bindable]
    public var data_array:ArrayCollection;

    // ArrayCollectionを作成する
    public function init():void{
        data_array = new ArrayCollection(def_array);
    }

    private function btn_click_add():void{
        data_array.addItemAt({name:'suzuki',money:500,number:1},1);
    }
    private function btn_click_remove():void{
        if(dg.selectedIndex >= 0){
            data_array.removeItemAt(dg.selectedIndex);
        }
    }
    ]]>
</mx:Script>
<mx:DataGrid dataProvider="{data_array}" id="dg">
        <mx:columns>
            <mx:DataGridColumn dataField="name" headerText="名前" />
            <mx:DataGridColumn dataField="money" headerText="金額" />
            <mx:DataGridColumn dataField="number" headerText="番号" />
        </mx:columns>
    </mx:DataGrid>
<mx:Button label="要素の追加" click="btn_click_add()" />
<mx:Button label="要素の削除" click="btn_click_remove()" />
</mx:Application>

同じことをArrayでやろうとする。
Arrayにももちろん要素の追加や削除メソッドがあります。
しかし、そのメソッドを使用してもDataGridが変化することはありません。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="init()" pageTitle="要素の追加・削除:コレクション">
<mx:Script>
<![CDATA[
    import mx.collections.*;
    import mx.controls.Alert;
    // 元となるデータを作成
    [Bindable]
    private var def_array:Array = [
        {name:'suzuki',money:500,number:1},
        {name:'sato',money:300,number:2}
    ];

    private function btn_click_add():void{
        def_array.push( { name:'suzuki', money:500, number:1 } );
    }
    private function btn_click_remove():void{
        if(dg.selectedIndex >= 0){
            def_array.splice(dg.selectedIndex);
        }
    }
    ]]>
</mx:Script>
<mx:DataGrid dataProvider="{def_array}" id="dg">
        <mx:columns>
            <mx:DataGridColumn dataField="name" headerText="名前" />
            <mx:DataGridColumn dataField="money" headerText="金額" />
            <mx:DataGridColumn dataField="number" headerText="番号" />
        </mx:columns>
    </mx:DataGrid>
<mx:Button label="要素の追加" click="btn_click_add()" />
<mx:Button label="要素の削除" click="btn_click_remove()" />
</mx:Application>

自動的に反映はしてくれないんですね。
ここがArrayCollectionやXMLListCollectionを使う理由のひとつになりそうです。

ただ、DataGridはArrayを読み込んだ時点で自動的にArrayCollectionを生成します。
ですので、読み込んだデータがArrayでも生成されたArrayCollectionを操作することで、同じような効果を出すことができます。
生成されたArrayCollectionはdataProviderを通して操作します。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="init()" pageTitle="要素の追加・削除:コレクション">
<mx:Script>
<![CDATA[
    import mx.collections.*;
    import mx.controls.Alert;
    // 元となるデータを作成
    [Bindable]
    private var def_array:Array = [
        {name:'suzuki',money:500,number:1},
        {name:'sato',money:300,number:2}
    ];

    private function btn_click_add():void{
        dg.dataProvider.addItemAt({name:'suzuki',money:500,number:1},1);
    }
    private function btn_click_remove():void{
        if(dg.selectedIndex >= 0){
            dg.dataProvider.removeItemAt(dg.selectedIndex);
        }
    }
    ]]>
</mx:Script>
<mx:DataGrid dataProvider="{def_array}" id="dg">
        <mx:columns>
            <mx:DataGridColumn dataField="name" headerText="名前" />
            <mx:DataGridColumn dataField="money" headerText="金額" />
            <mx:DataGridColumn dataField="number" headerText="番号" />
        </mx:columns>
    </mx:DataGrid>
<mx:Button label="要素の追加" click="btn_click_add()" />
<mx:Button label="要素の削除" click="btn_click_remove()" />
</mx:Application>

まとめ

他にも便利な機能がいろいろあるようです。
その機能を使えるようにするためにコレクションを有効活用しましょう。

Name
Comment

To pagetop


wonder_boys

wonder
Webデザイナー兼マークアップエンジニア。 静岡県浜松市在住。

RSS Entries

RSS Comments

Sponsored

Entries

Archive

Categories

Tags

まとめ アクセシビリティ イベント イベントリスナー オブジェクト オライリー バグ マイクロフォーマット マークアップ ユーザビリティ レビュー 引数 携帯サイト 正規表現 画像 目標 管理画面 背景 設定 alt AS3.0 Bitmap canvas content css DataGrid dreamweaver Flex form HTML html5 IK iphone javascript meta middle PHP png SGML SVG table wordpress XHTML XML

Links

킹ēǂ݂uOp[c