为什么在Actionscript中没有可用于ArrayCollections的addAll()函数?

时间:2008-12-23 17:59:01

标签: flex actionscript

在Actionscript中使用ArrayCollections时,为什么没有可用的addAll()函数?我一直在使用for循环使用addItem()一次一个地添加它们。这是常见还是有更便捷的方式?

4 个答案:

答案 0 :(得分:4)

我可以为此添加一些历史细微差别。显然,Adobe听说了Flex社区并做出了回应。已将一个addAll(addList:IList)方法添加到Flex 3.4 SDK中的ListCollectionView类型。

但是,如果还有其他人可能仍然在寻找能够全面运作的单行代码,那么这是我的一条很长的路线:

var arrColl1 = new ArrayCollection(['x','y','z']);
var arrColl2 = new ArrayCollection(['a', 'b', 'c']);

// Using Flex SDK version 3.4:
arrColl1.addAll( arrColl2 );

// Using any Flex SDK:
arrColl2.source.forEach(function(item:*, i:int, arr:Array):void { arrColl1.addItem(item); }, this);

这实际上是Flex实现的功能,并且应该正确处理绑定问题,尽管它不一定是最令人讨厌的事情。

答案 1 :(得分:2)

没有理由它不在那里,它只是不在那里。如果您将代码更改为使用普通Array而不是ArrayCollection,则可以使用Array.concat方法。否则,唯一的选择是循环中的addItem

答案 2 :(得分:2)

举例来说,尝试将其放入容器中。从本质上讲,似乎如果你必须有一个衬垫,创建一个带有原始源的新ArrayCollection以及新数据将起作用,至少在下面的情况下。尝试直接操作源代码似乎并不十分有用,至少对于数据绑定目的而言(如果不涉及数据绑定或事件,最好还是使用数组)。

<mx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;
        [Bindable] public var collection:ArrayCollection = new ArrayCollection([
            2,6,4,6,7,8,9
        ]);

        public function addToCollection():void {
            collection.addItem(Number(collectionValue.text));
        }

        public function newCollectionWithAddition():void {
            collection = new ArrayCollection(collection.source.concat(Number(collectionValue2.text)));
        }

        public function addToCollectionSource():void {
            collection.source.push(Number(sourceValue));
        }

        public function addToCollectionSourceWithRefresh():void {
            collection.source.push(Number(sourceValue2));
            collection.refresh();
        }
    ]]>
</mx:Script>

<mx:HBox width="100%">
    <mx:PieChart width="300" height="300">
        <mx:series>
            <mx:PieSeries dataProvider="{ collection }" />
        </mx:series>
    </mx:PieChart>
    <mx:PieChart width="300" height="300">
        <mx:series>
            <mx:PieSeries dataProvider="{ collection.source }" />
        </mx:series>
    </mx:PieChart>
</mx:HBox>

<mx:HBox>
    <mx:TextInput id="collectionValue" />
    <mx:Button label="Add To ArrayCollection"
        click="addToCollection()"
        />
</mx:HBox>

<mx:HBox>
    <mx:TextInput id="collectionValue2" />
    <mx:Button label="Create New ArrayCollection with new value"
        click="newCollectionWithAddition()"
        />
</mx:HBox>

<mx:HBox>
    <mx:TextInput id="sourceValue" />
    <mx:Button label="Add To ArrayCollection Source"
        click="addToCollectionSource()"
        />
</mx:HBox>

<mx:HBox>
    <mx:TextInput id="sourceValue2" />
    <mx:Button label="Add To ArrayCollection Source with refresh"
        click="addToCollectionSourceWithRefresh()"
        />
</mx:HBox>

答案 3 :(得分:-2)

经过一番调查后发现,ArrayCollection只是一个数组的包装器,你可以通过arrcoll1.source访问该数组。这允许你调用concat。我能够删除我的for循环并使用它。

var arrColl1 = new ArrayCollection(['x','y','z']);
var arrColl2 = new ArrayCollection(['a', 'b', 'c']);

arrColl1.source = arColl1.source.concat(arrColl2.source);

如果要连接数组,例如列表中的selectedItems,则可以执行以下操作:

arrColl1.source = arrColl1.source.concat(seletedItems);