我想知道如何在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?
答案 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()方法实现。
答案 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事件处理程序,否则您的处理程序会阻止默认值,然后弹出警报并反复重复。