階層コレクションの管理

"階層コレクション" は、単純なプリミティブ値以外の型の複雑なプロパティを持つオブジェクトを含んだコレクションです。たとえば、Person オブジェクトを含むコレクションで、Person オブジェクトが Address プロパティを持ち、その Address プロパティが番地、都市、州などのプロパティを持つことが考えられます。

階層コレクションを Data Management Service と組み合わせて管理する場合、3 つの方法があります。

これらのアプローチは、プロパティに応じて、単独で使用することも、組み合わせて使用することもできます。

階層値によるアプローチ、および管理された関連付けによるアプローチでは、fill 呼び出しから得られる同じオブジェクトグラフを親宛先で返します。階層値によるアプローチでは、親オブジェクトのアダプタが、複雑なプロパティ全体の状態を保存する役割を担います。これはデフォルトの動作です。親オブジェクトのアダプタはまた、sync 呼び出しに応答してグラフ全体を更新する役割も担います。何らかの変更が発生した場合は、オブジェクトの新しい完全なグラフを取得し、そのグラフで発生した変更をすべて更新する役割を担います。

管理された関連付けによるアプローチでは、親宛先の宛先設定に、独自の宛先を持つ子オブジェクトの関連付けを定義した追加のタグを含めます。この関連付けタグからは、子オブジェクトの状態を管理する役割を担う別の宛先を参照します。

階層値によるアプローチや管理された関連付けによるアプローチを使用する場合は、管理されたクラスの最上位オブジェクトのグラフにある各クラスを [Managed] メタデータタグを使用してマークするか、または mx.data.IManaged インターフェイスを明示的に実装する必要があります。これにより、管理されたオブジェクトで正しい変更イベントがサポートされ、遅延ロードされる 1 対 1 関連付けプロパティの getter メソッドから ItemPendingError をスローできるようになります。遅延ロードと ItemPendingError の詳細については、管理された関連付けの実装を参照してください。

次の例は、[Managed] メタデータタグを使用した ActionScript クラスのコードです。この Employee クラスは Employees という ArrayCollection で使用されます。Employees は Company クラスのプロパティとして使用されます。

package samples.crm
{
    
    import mx.data.IManaged;
    import mx.data.utils.Managed;
    import mx.core.mx_internal;
        
    [Managed]
    [RemoteClass(alias="samples.crm.Employee")]
    public class Employee    {
        public var employeeId:int;

        public var firstName:String = "";

        public var lastName:String = "";

        public var title:String = "";

        public var phone:String = "";

        public var email:String = "";
    }
}

次の例は、[Managed] メタデータタグを使用する代わりに mx.data.IManaged インターフェイスを実装したクラスです。implement mx.data.IManaged を実装する場合は mx.core.IUID インターフェイスをサポートする必要もあります。mx.core.IUID では uid プロパティが必要になります。また、このクラスの最後のコメントブロックの下で宣言されている referenceIds 変数と destination 変数を含める必要もあります。

import mx.core.mx_internal;
import mx.data.Managed;
import mx.data.IManaged;
import mx.utils.UIDUtil;

    [RemoteClass(alias="foo.bar.Customer")]
    public class Customer implements IManaged {
        public function Customer() {
        super();
    }

    [Bindable(event="propertyChange")]
    public function get firstName():String {
        _firstName = Managed.getProperty(this, "firstName", _firstName);
        return _firstName;
    }

    public function set firstName(value:String):void {
        var oldValue:String = this._firstName;
        _firstName = value;
        Managed.setProperty(this, "firstName", oldValue, _firstName);
    }
// IManaged のすべてのインプリメンタで IUID をサポートする必要があります。
// IUID には uid が必要になります。
    [Bindable(event="propertyChange")] 
    public function get uid():String {
        // uid にまだ値が割り当てられていない場合は、新しい値を作成します。
        if (_uid == null) {
            _uid = UIDUtil.createUID();
        }
        return _uid;
    }

    public function set uid(value:String):void {
        _uid = value;
    }
// これらは、DataService によって "管理される" ことを必要とするどのようなオブジェクトでも
// 必要になる、特別な要件です。
// referencedIds は、遅延ロードされるプロパティに属するオブジェクト ID の
// リストです。
// 宛先を使用し、リモート宛先にある "flex-dataservices.xml" ファイルの中で
// このオブジェクトによって設定された関連付けについて、それらに関する
// メタデータ情報を参照します。

    mx_internal var referencedIds:Object = {};
    mx_internal var destination:String;

    private var _firstName:String;
    private var _uid:String;
}

サブトピック

管理された関連付けの実装
fill メソッドでのオブジェクト関係の実装

Flex 2.01