flex - examples - apache royale
¿Por qué no hay una función addAll() disponible para ArrayCollections en Actionscript? (4)
¿Hay alguna razón por la cual no hay una función addAll () disponible cuando se usa ArrayCollections en Actionscript? He estado usando bucles for para agregarlos individualmente de a uno por vez usando addItem (). ¿Es esto común o hay una manera más conveniente?
Después de investigar un poco más, resulta que un ArrayCollection es solo un contenedor para una matriz y que usted tiene acceso a la matriz a través de arrcoll1.source. Esto le permite llamar a concat. Pude eliminar my for loop y usar esto en su lugar.
var arrColl1 = new ArrayCollection([''x'',''y'',''z'']);
var arrColl2 = new ArrayCollection([''a'', ''b'', ''c'']);
arrColl1.source = arColl1.source.concat(arrColl2.source);
Si está concatenando una matriz, por ejemplo, selectedItems en una lista, puede hacer esto:
arrColl1.source = arrColl1.source.concat(seletedItems);
No hay razón para que no esté allí, simplemente no está allí. Si cambiaste tu código para usar un Array
simple en lugar de un ArrayCollection
, puedes usar el método Array.concat
. De lo contrario, la única opción es addItem
en un bucle.
A modo de ejemplo, intente colocar esto en un contenedor. Esencialmente, parece que si tiene que tener un trazador de líneas único, la creación de un nuevo ArrayCollection con la fuente del original más los nuevos datos funcionarán, al menos en el caso siguiente. Los intentos de manipular la fuente directamente no parecen terriblemente útiles, al menos para fines de enlace de datos (y si no están implicados el enlace de datos o los eventos, es mejor usar una matriz de todos modos).
<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>
Puedo agregar algunos matices históricos a esto. Aparentemente, Adobe escuchó a la comunidad Flex y respondió. Se ha agregado un método addAll (addList: IList) al tipo ListCollectionView en Flex 3.4 SDK.
Pero por si acaso hay otros que todavía pueden estar buscando un equivalente de una sola línea que funcione en todos los ámbitos, esta es mi línea muy larga:
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);
Esto es esencialmente lo que hace la implementación de Flex, y debe manejar las cuestiones vinculantes correctamente, aunque no necesariamente es lo más lindo de mirar.