Сортировка коллекции и сортировка остаются на месте при добавлении в коллекцию? - PullRequest
2 голосов
/ 30 июня 2011

Когда я возвращаю коллекцию с уровня сервиса, я создаю ArrayCollection и применяю сортировку.Когда я добавляю элемент в коллекцию позже, сортировка остается на месте?Кажется, это так.Я думал, что сортирую только один раз, не применяя сортировку, которая будет придерживаться ???

Вот метод добавления элемента:

private function onAddNewClick():void
        {
            var fileTemplate:FileTemplateDetailDTO = new FileTemplateDetailDTO();   
            fileTemplate.fileTemplateId = 0;
            fileTemplate.fileTmpltDtlId = 0;
            fileTemplate.createdBy = appModel.userName;

            newFieldsDp.addItem( fileTemplate );

            this.fieldsGridEmpty.rowCount = newFieldsDp.length + 1;
            totalCount = newFieldsDp.length;
            this.fieldsGridEmpty.scrollToIndex( totalCount );
        }

И вот что япопробуем сейчас, когда данные возвращаются из сервиса:

for each( var dto:FileTemplateCompositeDTO in coll ){
            dto.templateHistory = createHistoryColl( dto.details );
            var sortedArray:ArrayCollection = sortDetails( dto.details );
            sortedArray.sort = null;
            var freshArray:Array = sortedArray.toArray();
            dto.details.source = freshArray;
            model.fileTemplateComposites.addItem( FileTemplateCompositeDTO( dto ) );
        }

Ответы [ 4 ]

3 голосов
/ 30 июня 2011

Самый простой способ сделать одноразовую сортировку:

var array:Array = yourArrayCollection.toArray():
array.sortOn("SomePropertyAvailableInEachItem", Array.DESCENDING | Array.NUMERIC);
yourArrayCollection.refresh();

Поскольку вы не сортируете базовый массив, а не коллекцию.

2 голосов
/ 30 июня 2011

Сорт ArrayCollection останется связанным с ним.Вы можете попробовать установить для атрибута sort значение null после начальной сортировки и обновления, но я не уверен на 100%, что следующий refresh() сохранит порядок элементов (хотя и должен).

Другой подход: после применения начальной сортировки к вашей коллекции вы можете вызвать ее метод toArray() для получения (отсортированного) массива, а затем просто создать новый ArrayCollection, передав этот массив в качестве его источника в конструкторе.Обратите внимание, что ArrayCollection на самом деле является просто оболочкой для массива, поэтому toArray() и создание нового ArrayCollection для существующего массива не должны быть тяжелыми операциями.

2 голосов
/ 30 июня 2011

Нет. Вам следует звонить myCollection.refresh() каждый раз, когда он меняется. Но вы можете прослушать collectionChange событие и оттуда обновить вызов:

    private function collectionChangeHandler(event:CollectionEvent):void
    {
        if (event.kind == CollectionEventKind.ADD || event.kind == CollectionEventKind.REMOVE ||
            event.kind == CollectionEventKind.REPLACE || event.kind == CollectionEventKind.MOVE || event.kind == CollectionEventKind.UPDATE)
        {
            ArrayCollection(event.currentTarget).refresh();
        }
    }
1 голос
/ 30 июня 2011

A Sort на ArrayCollection - это сам объект.Когда вы присваиваете объект Sort свойству sort в ArrayCollection, он остается назначенным, пока вы не удалите его вручную.Чтобы удалить его, просто установите для свойства sort на ArrayCollection значение null после вызова refresh().

myArrayCollection.sort = mySort;
myArrayCollection.refresh();
myArrayCollection.sort = null;

Теперь каждый раз, когда вы вызываете refresh () для ArrayCollection, sort больше не на месте.

...