Почему нет функции addAll () для ArrayCollections в Actionscript? - PullRequest
2 голосов
/ 23 декабря 2008

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

Ответы [ 4 ]

4 голосов
/ 11 ноября 2009

Я могу добавить к этому исторический нюанс. Судя по всему, 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, и должно корректно обрабатывать проблемы связывания, хотя это не обязательно самая красивая вещь, на которую нужно смотреть.

2 голосов
/ 29 декабря 2008

Например, попробуйте добавить это в контейнер. По сути, кажется, что если вам нужен один вкладыш, создание новой коллекции 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>
2 голосов
/ 23 декабря 2008

Нет причин, по которым его там нет, просто его там нет. Если вы изменили свой код для использования простого Array вместо ArrayCollection, вы можете использовать метод Array.concat. В противном случае единственной опцией является addItem в цикле.

0 голосов
/ 23 декабря 2008

После еще одного исследования выясняется, что 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...