2009-10-05 4 views
3

J'ai deux commandes mx:TileList que j'utilise pour autoriser l'édition d'objets par lot. Le premier contient une collection de toutes les données disponibles et le second contient le lot actuel. Les deux sont liés à ArrayCollections, et en utilisant la fonctionnalité native glisser-déposer du contrôle TileList, les données sont déplacées d'un ArrayCollection à l'autre lorsqu'un objet est déplacé entre eux.Flex Drag & Drop: Détection du moment où toutes les données ont été déplacées de la source à la destination

Je dois changer le currentState pour afficher & réinitialiser les commandes de manipulation de lots lorsque le nombre de lots va de 0 à n ou n à articles. Basé sur the documentation, j'aurais pensé que je devrais écouter l'événement dragComplete, mais mon test montre qu'au lieu de tirer après que les données aient été enlevées de l'ArrayCollection source et ajoutées à l'ArrayCollection de destination, il tire (uniformément) entre ces deux actes.

Les deux listes sont similaires à ceci:

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

Et voici la source de la fonction 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 = ''; 
    } 
} 

Et enfin, voici quelques exemple de sortie de l'exécution du code. Ceux-ci sont tous exécutés l'un après l'autre.

Cas 1:

Les charges d'application avec 10 objets dans la première liste et le lot est vide. J'ai traîné 1 objet de la liste des sources vers la liste des lots.

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

(prévoir: 1,9)

De toute évidence, l'objet a été ajouté à la ArrayCollection par lots, mais pas retiré de la source.

Cas n ° 2:

Maintenant, je vais faire glisser un 2ème objet dans le lot.

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

(prévoir: 2,8)

Tout d'abord, nous pouvons voir que images.length a changé, montrant que l'objet que je traîné hors de la liste des sources à la liste des lots a été enlevé APRÈS l'événement dragComplete a été déclenché. La même chose se produit cette fois: Le nouvel objet est ajouté au lot ArrayCollection (batch.length = 2), les événements dragComplete se déclenchent (en exécutant ces traces), puis l'objet est supprimé de la collection ArrayCollection source.

Cas n ° 3:

Maintenant, je vais faire glisser les images de la liste des lots à leur emplacement d'origine dans la liste des sources.

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

(prévoir: 0,10)

Nous pouvons voir que batch.length n'a pas baissé, mais le tableau d'images source est de retour à sa longueur initiale de 10.

QUESTION: Est-ce que je fais quelque chose de mal? Y at-il un autre événement que je pourrais écouter? (Note: J'ai essayé deuxDragExitetDragDrop, juste pour être sûr, et ceux qui se comportent comme prévu, mais ne sont pas ce que je besoin.) Ou est-il un autre moyen pour obtenir les données que je veux? Ou ... ai-je trouvé un bug dans le SDK?

Répondre

1

Pouvez-vous écouter un événement collectionChange sur votre ArrayCollections cible?

batch.addEventListener(CollectionEvent.COLLECTION_CHANGE, handleBatchCollectionChange); 
+0

Oui, cela a exactement ce dont j'ai besoin. Je vous remercie! Je vais modifier mon code dans votre réponse. –

0

Voici une autre solution qui a bien fonctionné pour moi.

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" 
/> 
Questions connexes