代码之家  ›  专栏  ›  技术社区  ›  Adam Tuttle

灵活拖放:检测所有数据从源移动到目标的时间

  •  3
  • Adam Tuttle  · 技术社区  · 15 年前

    我有两个 mx:TileList 控件,用于批量编辑对象。第一个包含所有可用数据的集合,第二个包含当前批处理。两者都是必然的 ArrayCollections ,并使用tilleist控件的本机拖放功能将数据从一个 ArrayCollection 当一个物体被拖到另一个物体之间时。

    我需要改变 currentState 当批次计数从 n n 项目。基于 the documentation 我想我应该听听 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事件已激发。

    这次也会发生同样的事情:将新对象添加到batch arraycollection(batch.length=2),然后 拖曳完成 事件激发(运行这些跟踪),然后从源ArrayCollection中移除该对象。

    案例3:

    现在,我将把两个图像从批处理列表中拖回源列表中的原始位置。

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

    (预期:0,10)

    我们可以看到batch.length没有下降,但是源图像数组回到了原来的长度10。

    问题: 我做错什么了吗?还有别的事情我可以听吗?( 注:我都试过了 DragExit DragDrop 我只是想确定一下,它们的行为和预期的一样,但不是我需要的。 )还是有其他方法来获取我想要的数据?或者…我在SDK中发现了一个bug吗?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Adam Tuttle    15 年前

    您是否可以在目标阵列集合上侦听CollectionChange事件?

    batch.addEventListener(CollectionEvent.COLLECTION_CHANGE, handleBatchCollectionChange);
    
        2
  •  0
  •   Vinod    14 年前

    这是另一个对我很有效的解决方案。

    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"
    />
    
    推荐文章