Есть ли причина, по которой при использовании ArrayCollections в ActionScript недоступна функция addAll ()? Я использовал циклы for, чтобы добавлять их по одному с помощью addItem (). Это распространено или есть более удобный способ?





Нет причин, по которым его там нет, его просто нет. Если вы изменили свой код, чтобы использовать простой Array вместо ArrayCollection, вы можете использовать метод Array.concat. В противном случае единственный вариант - это addItem в цикле.
После некоторого дополнительного исследования выясняется, что 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);
Не могу ли я обновить коллекцию после использования concat?
Я не думаю, что это имеет значение, вызываете вы обновление или нет. Ваш код может действительно работать, поскольку вы заменяете весь внутренний массив, а не просто изменяете его, но в документации Flex об этом ничего не говорится. (Во всяком случае, никогда не стоит полагаться на недокументированное поведение.)
В качестве примера попробуйте бросить это в контейнер. По сути, кажется, что если вам нужен один лайнер, создание новой коллекции 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>
Я могу добавить к этому исторический нюанс. Судя по всему, Adobe услышала сообщество Flex и отреагировала. Метод addAll (addList: IList) был добавлен к типу ListCollectionView в Flex 3.4 SDK.
Но на всякий случай, если есть другие, которые все еще могут искать однострочный эквивалент, который работает повсеместно, вот моя одна-очень-длинная строка:
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, и она должна правильно обрабатывать проблемы привязки, хотя это не обязательно самая красивая вещь, на которую стоит смотреть.
Вам следует прочитать документацию еще раз. «Объект ArrayCollection не представляет никаких изменений, которые вы вносите непосредственно в исходный массив. Всегда используйте методы ICollectionView или IList для изменения коллекции».