2009-08-26 7 views
1

Ich frage mich, wie das in Flex zu erreichen.Flex Script und Event Frage

Grundsätzlich habe ich Drag-and-Drop in einigen meiner Listensteuerelemente aktiviert.

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

In der Funktion dg1_dragDropHandler Ereignis habe ich die folgenden Codes:

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

}

In den Codes oben, ich will da das die prevent() auf der alertHandler Funktion aufzurufen Andere Skripts nach dem Aufruf des Alert.show in dg1_dragDropHandler-Ereignis würden gleichzeitig mit der alert.show ausgeführt werden.

Wie kann ich das DragEvent des dg1_dragDropHandler-Ereignisses vom alertHandler-Ereignis referenzieren?

Antwort

1

Anstelle der Angabe Ihrer Listener-Funktion handleAlert() können Sie als normale Funktion eine anonyme Funktion verwenden. Schreiben Sie Ihren Code wie folgt:

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); 
      } 
    } 

Wenn Sie eine anonyme Funktion verwenden, haben Sie noch Zugriff auf alle Variablen in Ihrem aktuellen Bereich. Das bedeutet, dass Sie weiterhin auf die Variable evt: DragEvent zugreifen können. Wie Glenn schon sagte, ich weiß nicht, ob das dein Standardaktions-Problem lösen wird.

0

Wahrscheinlich möchten Sie die Details des dropEvent in einer lokalen Variablen speichern. Dann, wenn Sie Ihren "preventDefault" -Teil tun wollen, greifen Sie einfach auf das Ereignisobjekt zu und machen Sie Ihre Magie.

Nicht sicher, warum Sie aberDefault verhindern möchten. Ich verstehe diesen Teil nicht ganz. Würden nicht alle anderen Zuhörer des Ereignisses vollständig ausgeführt werden, während das Programm darauf wartet, dass Sie JA/NEIN zu dem Alarm sagen?

+0

Der Parameter preventDefault soll den DragDrop-Vorgang verhindern, wenn die Bedingung nicht erfüllt ist. Wie Sie sehen können, habe ich dort eine limitierende Alert.show-Funktion platziert, um vom Benutzer zu bestätigen, ob er trotz * der Bedingung mit der Operation fortfahren soll. Wenn der Benutzer auf NO klickt, habe ich keine Ahnung, wie der alertHandler mit der preventDefault-Funktion umgehen kann, die nur für das dragEvent verfügbar ist. – Angelo

+0

Was ich sage ist, dass ich erwarte, dass es zu spät ist, wenn Sie auf "NEIN" klicken. Das Problem ist, ich glaube, Sie haben es mit mehreren Callstacks zu tun. Während der Alarmdialog angezeigt wird, erwarte ich, dass Ihre anderen Anruflisten das Ereignis ausführen und abschließen. Vielleicht, was Sie tun wollen, lassen Sie den Tropfen, aber wenn "NEIN" ausgewählt ist, löschen Sie den Tropfen sofort. – Glenn

+0

Ja, du hast recht. Die anderen Aufruf-Stacks werden sofort ausgeführt. Wenn das Nein ausgewählt ist, dann verhindern Sie das Löschen, indem Sie preventDefault des Ereignisses aufrufen. Aber wenn Sie das Gleiche nur vom alertHandler aus tun könnten, wie würden Sie dann auf das dragEvent verweisen? – Angelo

0

Welche anderen Teile des Callstacks funktionieren hier? Sie können verhindern, dass irgendetwas in der Ereigniskette passiert, indem Sie event.stopImmediatePropergation(); in der ersten Zeile Ihres dragDropHandlers (vorausgesetzt, der Listener hat eine höhere Priorität als andere in der Kette). Sie müssten dann die Drag & Drop-Vorgänge bei der Bestätigung manuell replizieren, was ich nicht genau weiß, aber Sie können dies mit der Methode doDrag() des DragManager erreichen.

DragManager.doDrag() langauge reference

0

Sie haben völlig Recht, dass die Benachrichtigung asynchron zum Original Dragevent Versand in Bezug tauchte wird.

Da das standardmäßige DataGrid-Verhalten zu diesem Zeitpunkt nicht aktiviert werden soll, müssen Sie beim Empfang des Ereignisses die Funktion preventDefault() aufrufen und die Alarmanzeige aufheben.

Dann können Sie im Erfolgszweig Ihres Alert-Handlers versuchen, erneut (werfen Sie einen neuen) DragEvent. Verwenden Sie eine lokale Variable, um die ursprünglichen Ereignisdetails zu verfolgen, sodass Sie klonen() oder einfach ein neues Ereignis mit denselben Eigenschaften erstellen können. Sie unterbrechen und unterbrechen den Ereignisfluss und versuchen, ihn später fortzusetzen.

Ich habe das selbst nicht versucht, aber das ist, was ich zuerst erkunden würde.

0

Ich habe dies selbst nicht versucht, aber das Verhindern des sofortigen Verhaltens ist die einzige Möglichkeit, das Gitter daran zu hindern, die Kopie oder den Umzug durchzuführen.

Versuchen Sie, das Standardverhalten zu verhindern und das Ziehereignis beizubehalten. Wenn Ihr Benutzer auf "Nein" klickt, haben Sie das Ereignis bereits beendet. Wenn der Benutzer "Ja" drückt, können Sie (das ist der Teil, bei dem ich mich nicht sicher bin) das Drop-Ereignis im Grid erneut versenden. Hoffentlich wird es sich normal verhalten. Um das Ereignis in Ihren Alert-Handler zu bekommen, können Sie einfach die Dateneigenschaft im Ereignisfenster verwenden, um es zu verfolgen.

Noch einmal nicht ganz sicher, ob es funktionieren wird, nur aus der Spitze meines Kopfes. Natürlich müssen Sie den benutzerdefinierten DragDrop-Event-Handler aus Ihrem Grid entfernen, bevor Sie den genehmigten Drag-Vorgang erneut einreichen. Andernfalls wird der Standard-Handler mit dem Standard-Pulldown-Befehl deaktiviert.