0

ソースコレクション(現在は単純な配列)があります。実行時に、ソースと同じ配列を使用してArrayCollectionsを作成します(各コレクションは同じソースを表示しますが、フィルターは異なります)。私の問題は、新しいアイテムがソースに追加されたときに、この新しいアイテムのプロパティの1つが更新された場合、すでに作成されたarraycollectionsが更新されないことです。

誰かがこれに対する解決策を持っていますか?ソースが辞書の場合はどうなりますか。新しいアイテムが追加されるたび、またはアイテムが更新されるたびにコレクションが更新されるときに、ソースディクショナリからさまざまなArrayCollectionを作成するにはどうすればよいですか?

ありがとう

4

3 に答える 3

2

問題は、アレイが[Bindable]Flexにないことです。したがって、いくつかのオプションがあります。

  • ArrayCollectionsourceを作成し、のaddEventListenerを作成しCollectionEvent.COLLECTION_CHANGEます。
  • 何らかの方法ですべての配列コレクションにアイテムを追加して、addItemToCollectionsすべての同期を維持します。

これが私が説明していることの例です:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application
    xmlns:mx="http://www.adobe.com/2006/mxml"
    xmlns:local="*"
    creationComplete="creationCompleteHandler()">

    <mx:Script>
        <![CDATA[
            import mx.events.CollectionEvent;
            import mx.events.CollectionEventKind;
            import mx.collections.ArrayCollection;
            import ColorPalette;

            protected function creationCompleteHandler():void
            {
                var item:Object;
                var i:int = 0;
                var n:int = source.length;
                for (i; i < n; i++)
                {
                    item = source[i];
                    collectionA.addItem(item);
                    collectionB.addItem(item);
                    collectionC.addItem(item);
                    bindableCollection.addItem(item);
                }
                bindableCollection.addEventListener(CollectionEvent.COLLECTION_CHANGE, collectionChangeHandler);
            }

            protected function collectionChangeHandler(event:CollectionEvent):void
            {
                switch (event.kind)
                {
                    case CollectionEventKind.ADD :
                        collectionA.addItem(event.items[0]);
                        collectionB.addItem(event.items[0]);
                        collectionC.addItem(event.items[0]);
                    break;
                }
            }

            public function addItem():void
            {
                source.push({name:"new item " + (Math.random()*1000).toString()});
            }

            public function addItemToCollection():void
            {
                var item:Object = {name:"new item " + (Math.round(Math.random()*1000)).toString()};
                collectionA.addItem(item);
                collectionB.addItem(item);
                collectionC.addItem(item);
            }

            public function addToBindableCollection():void
            {
                var item:Object = {name:"new item " + (Math.round(Math.random()*1000)).toString()};
                bindableCollection.addItem(item);
            }

        ]]>
    </mx:Script>

    <mx:Array id="source">
        <mx:Object name="one"/>
        <mx:Object name="two"/>
        <mx:Object name="three"/>
    </mx:Array>

    <mx:ArrayCollection id="collectionA"/>
    <mx:ArrayCollection id="collectionB"/>
    <mx:ArrayCollection id="collectionC"/>
    <mx:ArrayCollection id="bindableCollection"/>

    <!-- sample lists -->
    <mx:Panel id="panel" width="100%" height="100%">
        <mx:Button label="Add Item to Source" click="addItem()"/>
        <mx:Button label="Add Item to Collections" click="addItemToCollection()"/>
        <mx:Button label="Add Item to Bindable Collection" click="addToBindableCollection()"/>
        <mx:HBox width="100%" height="100%">
            <mx:List id="listA" dataProvider="{collectionA}" labelField="name"/>
            <mx:List id="listB" dataProvider="{collectionB}" labelField="name"/>
            <mx:List id="listC" dataProvider="{collectionC}" labelField="name"/>
        </mx:HBox>
    </mx:Panel>

</mx:Application>

それが役に立ったら教えてください、ランス

于 2010-02-19T23:13:40.240 に答える
0

ObjectUtil.copy()を使用して、配列のコピーを作成する必要があると思います。

于 2010-02-19T22:23:27.263 に答える
0

私の解決策は次のとおりです。ArrayCollectionから派生した新しいクラスを作成しました。SourceCollectionという名前を付けます。weakKeysをtrueに設定して作成された辞書である新しいプライベートメンバーを追加しました。新しいパブリック関数は、その要素から新しいArrayCollectionを作成し、この作成されたコレクションの参照を次のようにプライベートディクショナリに追加します。

public function createCollection():ArrayCollection
{
   var result:ArrayCollection = new ArrayCollection();
       result.addAll(this);
   createdCollections[result] = null;
   return result;
}

addItemAt、removeItemAt、およびremoveAll関数をオーバーライドしました。それぞれがスーパー関数を呼び出してディクショナリを反復処理し、適切な関数を実行します。addItemとaddAllもaddItemAtを呼び出すため、これらをオーバーライドする必要はありません。一例は次のとおりです。

override public function addItemAt(item:Object, index:int):void
{
   super.addItemAt(item, index);

   for (var coll:Object in createdCollections)
   {
     (coll as ArrayCollection).addItemAt(item, index);
   }
}

また、辞書を反復処理して項目をカウントするテスト関数を追加しました。リストを動的に作成し、createCollection関数を使用してソースから作成されたArrayCollectionを割り当て、反映されたファインを追加、削除すると、すべてに必要な同じソースアイテムがあり、動的に作成されたリストを削除すると、しばらくすると、追跡リストの数が自動的に減少します。

変更時にpropertyChangeイベントをディスパッチするソースにオブジェクトを配置すると、すべてのリストにも変更が表示されます。

于 2010-02-20T13:44:04.277 に答える