Flex脚本和事件问题

时间:2009-08-26 07:56:14

标签: flex events

我想知道如何在Flex中实现这一点。

基本上,我在一些列表控件中启用了拖放功能。

<mx:DataGrid id="dg1" width="100%" height="100%" dataProvider="{xmllcData}"   
             dropEnabled="true" dragDrop="dg1_dragDropHandler(event)">
</mx:DataGrid>

在函数dg1_dragDropHandler事件中,我有以下代码:

private function dg1_dragDropHandler(evt:DragEvent):void
{
  // Perform some actions here...
  // .......

  // Show Message to Confirm.
Alert.show('Proceed?', 'Title', Alert.YES | Alert.NO, null, handleAlert, null, Alert.YES);
}

private function handleAlert(evt:CloseEvent):void 
{
  if (evt.detail == Alert.YES)
{
    // Perform the functions as necessary
}
else
{
    // Execute the script to prevent the dropping of the object.
    // How can I call the DragEvent.preventDefault(); function from here?
}

}

在上面的代码中,我想在alertHandler函数上调用preventDefault(),因为在调用dg1_dragDropHandler事件中的Alert.show之后的其他脚本将与alert.show同时执行。

我如何能够从alertHandler事件中引用dg1_dragDropHandler事件的DragEvent?

5 个答案:

答案 0 :(得分:1)

您可以使用匿名函数,而不是将侦听器函数handleAlert()指定为普通函数。写下你的代码:

private function dg1_dragDropHandler(evt:DragEvent):void
   {
   // Perform some actions here...
   // .......

   // Show Message to Confirm.
   Alert.show('Proceed?', 'Title', 
               Alert.YES | Alert.NO, 
               null, 
               function(evt:CloseEvent) {
                     if (evt.detail == Alert.YES) {
                        // Perform the functions as necessary
                     }
                     else {
                      // Execute the script to prevent the dropping of the object.
                      // Now you have access to the evt:DragEvent!
                     }
                },
                null, Alert.YES);
             }
     }

使用匿名函数时,您仍然可以访问当前范围内的所有变量。这意味着您仍然可以访问evt:DragEvent变量。正如格伦所说,我不知道这是否会解决您的默认操作问题。

答案 1 :(得分:0)

您可能希望将dropEvent的详细信息存储在本地变量中。然后,当你想要做“preventDefault”部分时,只需访问事件对象并发挥你的魔力。

不确定为什么要阻止默认。我不太了解那一部分。当程序等待你对警报说“是/否”时,事件的所有其他听众是否都会完成?

答案 2 :(得分:0)

callstack的哪些其他部分在这里运行?你可以通过调用event.stopImmediatePropergation()来阻止事件链中的任何其他事件发生。在dragDropHandler的第一行(假设侦听器的优先级高于链中的其他人)。 然后,您需要在确认时手动复制拖放操作,我不确定,但您可以使用DragManager的doDrag()方法实现。

DragManager.doDrag() langauge reference

答案 3 :(得分:0)

对于原始DragEvent调度,警报将异步弹出,这是完全正确的。

由于您不希望在此时启动默认数据网格行为,因此您需要在收到事件时调用preventDefault(),然后启动警报面板。

然后,在警报处理程序的成功分支中,您可以尝试重新抛出(抛出一个新的)DragEvent。使用局部变量来跟踪原始事件详细信息,以便您可以克隆()或只是创建具有相同属性的新事件。基本上,您正在拦截和中断事件流,然后尝试稍后恢复它。

我自己没试过,但这就是我首先要探索的内容。

答案 4 :(得分:0)

我自己没有尝试过,但是立即阻止默认行为是阻止网格执行复制或移动的唯一方法。

尝试阻止默认行为并维护拖动事件。然后,如果用户单击否,则表示您已停止该事件。如果用户点击是,您可以(这是我不确定的部分)在网格上重新调度drop事件。希望它会表现正常。要将事件放入Alert处理程序,只需使用Event窗口中的data属性即可跟踪它。

private function dg1_dragDropHandler(evt:DragEvent):void 
{ 
  // Perform some actions here... 
  // ....... 

  evt.preventDefault();

  // Show Message to Confirm. 
Alert.show('Proceed?', 'Title', Alert.YES | Alert.NO, null, handleAlert, null, Alert.YES).data = evt; 
} 

private function handleAlert(evt:CloseEvent):void  
{ 
  if (evt.detail == Alert.YES) 
{ 
        // Perform the functions as necessary 
    var dgEvt:DragEvent = Alert(evt.currentTartet).data;
    var newDrag:DragEvent;   //need a new event because the default behaviour on the old one is still prevented
     //copy event values to new drag event
    dg1.dispatchEvent(newDrag);

} 
else 
{ 
        // Execute the script to prevent the dropping of the object. 
        // How can I call the DragEvent.preventDefault(); function from here? 
} 

同样,不完全确定它是否会起作用,就在我的脑海中。当然,在重新调整批准的拖动之前,您必须从网格中删除自定义dragDrop事件处理程序,否则您的处理程序会阻止默认值,然后弹出警报并反复重复。