Flex Script и вопрос о событии - PullRequest
       44

Flex Script и вопрос о событии

1 голос
/ 26 августа 2009

Интересно, как этого добиться во Flex.

По сути, я включил Drag and Drop в некоторых моих элементах управления списком.

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

}

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

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

Ответы [ 5 ]

1 голос
/ 29 августа 2009

Вместо указания функции прослушивателя 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 голосов
/ 29 января 2010

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

Попробуйте отключить поведение по умолчанию и сохранить событие перетаскивания. Затем, если вы нажмете «Нет», вы уже остановили событие. Если пользователь нажимает «да», вы можете (это часть, в которой я не уверен) повторно отправить событие сброса в сетке. Надеюсь, он будет вести себя нормально. Чтобы передать событие в обработчик 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 из вашей сетки, прежде чем вы повторно отправите одобренное перетаскивание, в противном случае ваш обработчик может запретить использование по умолчанию, затем выдать предупреждение и повторять снова и снова.

0 голосов
/ 04 сентября 2009

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

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

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

Сам не пробовал, но это то, что я изучу в первую очередь.

0 голосов
/ 04 сентября 2009

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

DragManager.doDrag () ссылка на язык

0 голосов
/ 26 августа 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...