2009-08-26 4 views
1

Интересно, как достичь этого в Flex.Flex Script and Event Question

В принципе, я разрешил перетаскивание некоторых элементов управления списком.

<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? 
} 

}

В приведенных выше кодов, я хочу, чтобы вызвать preventDefault() на функцию alertHandler после другие скрипты после вызова события Alert.show в dg1_dragDropHandler будут выполняться одновременно с alert.show.

Как я могу ссылаться на DragEvent события dg1_dragDropHandler из события alertHandler?

ответ

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. Однако, как сказал Гленн, я не знаю, решит ли это проблему по умолчанию.

0

Возможно, вы захотите сохранить детали dropEvent в локальной переменной. Затем, когда вы хотите сделать свою часть «preventDefault», просто войдите в объект события и сделайте свою магию.

Не знаете, почему вы хотите предотвратить дефолт. Я не совсем понимаю эту часть. Разве все остальные слушатели события не будут завершены, пока программа ждет, когда вы ответите ДА/НЕТ на предупреждение?

+0

ПредотвращениеDefault предназначено для предотвращения операции dragDrop, если условие не выполнено. Как вы можете видеть, я установил ограничительную функцию Alert.show для подтверждения от пользователя, если продолжить операцию * несмотря на * условие. Если пользователь нажмет на NO, тогда я не знаю, как alertHandler сможет обрабатывать функцию preventDefault, доступную только для dragEvent. – Angelo

+0

То, что я говорю, это то, что я ожидаю, что к тому моменту, когда вы нажмете «НЕТ» в оповещении, уже слишком поздно. Проблема в том, что я считаю, что вы имеете дело с несколькими стеками вызовов. Пока отображается диалоговое окно с предупреждением, я ожидаю, что ваши другие стеки вызовов будут выполняться и завершить событие. Возможно, что вы хотите сделать, разрешите падение, но если выбрано «НЕТ», вы сразу же удалите падение. – Glenn

+0

Да, вы совершенно правы. Остальные стеки вызовов выполняются немедленно. Если выбрано значение «Нет», то предотвратите падение, которое выполняется путем вызова функции preventDefault события. Но если бы вы могли продолжать только то же самое из alertHandler, как бы вы ссылались на dragEvent? – Angelo

0

Какие другие части вызова используются здесь? Вы можете остановить все, что произошло в цепочке событий, вызвав event.stopImmediatePropergation(); в первой строке вашего dragDropHandler (при условии, что слушатель имеет более высокий приоритет, чем другие в цепочке). Затем вам нужно вручную реплицировать операции перетаскивания на подтверждение, что я не уверен, но вы можете добиться использования метода doDrag() DragManager.

DragManager.doDrag() langauge reference

0

Вы абсолютно правы, что оповещения будут выскочило асинхронно по отношению к первоначальному DragEvent отправки.

Поскольку вы не хотите, чтобы поведение по умолчанию datagrid начиналось в этот момент, вам необходимо вызвать preventDefault() при получении события, а затем вывести панель предупреждения.

Затем, в ветке успеха вашего обработчика предупреждений, вы можете попробовать rethrow (бросить новый) DragEvent. Используйте локальную переменную, чтобы отслеживать исходные данные события, чтобы вы могли клонировать() или просто создавать новое событие с теми же свойствами. В основном, вы перехватываете и прерываете поток событий, а затем пытаетесь возобновить его позже.

Не пробовал это сам, но это то, что я бы исследовал первым.

0

Я не пробовал это сам, но предотвращение по умолчанию действительного действия является единственным способом остановить сетку от выполнения копирования или перемещения.

Попробуйте предотвратить поведение по умолчанию и поддерживать событие перетаскивания. Затем, если пользователь не ударил, вы уже остановили событие. Если пользователь нажимает «да», вы можете (это часть, которую я не уверен) повторно отправить событие drop в сетке. Надеюсь, он будет вести себя нормально. Чтобы получить событие в обработчике Alert, вы можете просто использовать свойство data в окне Event для его отслеживания.

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 из своей сетки, прежде чем выполнять повторное назначение одобренного сопротивления, в противном случае ваш обработчик предотвратит использование по умолчанию, затем вытащите предупреждение и повторите снова и снова.