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