Flex Drag & Drop: обнаружение, когда все данные были перемещены из источника в место назначения - PullRequest
3 голосов
/ 05 октября 2009

У меня есть два mx:TileList элемента управления, которые я использую, чтобы разрешить редактирование объектов в пакетном режиме. Первый содержит коллекцию всех доступных данных, а второй содержит текущий пакет. Оба связаны с ArrayCollections, и с помощью встроенной функции drag-n-drop элемента управления TileList данные перемещаются из одного ArrayCollection в другой, когда объект перетаскивается между ними.

Мне нужно изменить currentState, чтобы отображать и сбрасывать элементы управления манипулированием партиями, когда счетчик партий меняется с 0 на n или n на 0 шт. Исходя из документации , я бы подумал, что мне следует прослушать событие dragComplete, но мое тестирование показывает, что вместо запуска после удаления данных из исходного ArrayCollection и добавления к целевому ArrayCollection Он запускается (последовательно) между этими двумя действиями.

Оба списка похожи на это:

<mx:TileList 
    id="srcList" 
    dragEnabled="true" 
    dropEnabled="true" 
    dragMoveEnabled="true" 
    dataProvider="{images}"
    dragComplete="handleDragComplete(event)"
    allowMultipleSelection="true"
/>

А вот источник функции handleDragComplete:

private function handleDragComplete(e:DragEvent):void{
    trace(e.dragInitiator.name + '.dragComplete: batch.length=' + batch.length.toString());
    trace(e.dragInitiator.name + '.dragComplete: images.length=' + images.length.toString());
    if (batch.length > 0){
        currentState = 'show';
    }else{
        currentState = '';
    }
}

И, наконец, вот некоторые примеры вывода кода из кода. Все они запускаются один за другим.

Дело 1:

Приложение загружается с 10 объектами в первом списке, и пакет пуст. Я перетащил 1 объект из списка источников в список пакетов.

srcList.dragComplete: batch.length=1
srcList.dragComplete: images.length=10

(ожидаемый: 1,9)

Очевидно, что объект был добавлен в пакетную коллекцию ArrayCollection, но не удален из источника.

Случай 2:

Теперь я перетащу второй объект в пакет.

srcList.dragComplete: batch.length=2
srcList.dragComplete: images.length=9

(Ожидаемое: 2,8)

Во-первых, мы видим, что images.length изменилась, показывая, что объект, который я перетащил из списка источников в список пакетов, был удален ПОСЛЕ событие dragComplete сработало.

В этот раз происходит то же самое: новый объект добавляется в пакетную коллекцию ArrayCollection (batch.length = 2), событие dragComplete запускается (запускает эти трассировки), а затем объект удаляется из исходной коллекции ArrayCollection.

Дело 3:

Теперь я перетащу оба изображения из списка пакетов обратно в их исходное местоположение в списке источников.

batchList.dragComplete: batch.length=2
batchList.dragComplete: images.length=10

(ожидаемое: 0,10)

Мы видим, что batch.length не уменьшился, но массив исходных изображений вернулся к своей первоначальной длине 10.

ВОПРОС: Я что-то не так делаю? Могу ли я послушать еще одно событие? ( Примечание: я попробовал и DragExit , и DragDrop, просто чтобы быть уверенным, и они ведут себя как ожидалось, но это не то, что мне нужно. ) Или есть другой способ получить данные, которые я хочу? Или ... я нашел ошибку в SDK?

Ответы [ 2 ]

1 голос
/ 05 октября 2009

Можете ли вы прослушать событие collectionChange в вашей целевой ArrayCollections?

batch.addEventListener(CollectionEvent.COLLECTION_CHANGE, handleBatchCollectionChange);
0 голосов
/ 20 мая 2010

Вот еще одно решение, которое хорошо сработало для меня.

private function dragBeginHandler():void {
    stage.addEventListener(MouseEvent.MOUSE_UP, dragFinishHandler);
    trace("Drag/drop started, Drag-completion listener added");
}

private function dragFinishHandler():void {
    stage.removeEventListener(MouseEvent.MOUSE_UP, dragFinishHandler);
    trace("Drag/drop finished, Drag-completion listener removed");

    //do or print whatever you want to do here, add/remove will be done by now
    trace('dragComplete: batch.length=' + batch.length.toString());
    trace('dragComplete: images.length=' + images.length.toString());

    if (batch.length > 0){
            currentState = 'show';
    }else{
            currentState = '';
    }
}

<mx:TileList 
        id="srcList" 
        dragStart="dragBeginHandler()"
        dragEnabled="true" 
        dropEnabled="true" 
        dragMoveEnabled="true" 
        dataProvider="{images}"
        dragComplete="handleDragComplete(event)"
        allowMultipleSelection="true"
/>
...