Flex FileReference.save() kann nur aufgerufen werden in ein Benutzer-Ereignis-handler — wie kann ich dies umgehen?
Muss ich anrufen FileReference.save () - nach einer web-service-Aufruf beendet wurde, aber diese Methode hat eine Einschränkung: "Im Flash Player, können Sie nur aufrufen, diese Methode erfolgreich in Reaktion auf ein Benutzerereignis (Z. B. in einer Ereignisprozedur für ein Mausklick-oder Tastendruckereignis). Andernfalls wird beim aufrufen dieser Methode in Flash Player ein Fehler zurückgegeben Ausnahme." (aus der Dokumentation hier)
Diese Einschränkung ist ein bisschen vage. Bedeutet es, dass ich nur zu rufen Sie die FileReference.save () - Methode innerhalb einer event-handler-Funktion registriert sich als listener für bestimmte Arten von user-events? Wenn ja, dann genau, welche user-events gültig sind? (Vielleicht gibt es ein Ereignis, das nie ausgelöst durch die Benutzerinteraktion mit meiner Anwendung, und ich könnte registrieren Sie einen Ereignis-handler-Funktionen das event-Typ und machen den save () - Aufruf innerhalb der Funktion?)
Mein Problem ist, dass ich nicht sicher rufen Sie die FileReference.save () - Methode, bis meine web-service gibt mit der Daten, die als das argument von der FileReference.save () - Methode aufrufen, damit der event ausgelöst wird die FileReference.save () - Aufruf ist eigentlich ein ResultEvent, anstatt eine Benutzer-Ereignis, und ich bin misstrauisch gegenüber der Einplanung eine neue (Fake -) user-event-Typ, um auslösen zu können die FileReference.save () - Aufruf, es sei denn, es ist auf jeden Fall eine Benutzer-Ereignis niemals ausgelöst werden, als Ergebnis der tatsächlichen Benutzer-Interaktion mit meiner Anwendung.
In einer nussschale, was ich jetzt mache ist Folgendes: ich habe eine Funktion, die registriert wird als handler für das klicken auf eine Schaltfläche. In dieser Funktion habe ich meine web-service-Aufruf zum abrufen von Daten vom server. Ich habe auch eine Ergebnis-handler-Funktion, die wird aufgerufen, wenn der web-service-Aufruf beendet ist, und es ist hier, dass ich möchten, rufen Sie die FileReference.save () - Methode, da es an dieser Stelle, dass ich weiß, dass die Daten bereit sind, um in einer Datei gespeichert werden. Aber die oben genannten Einschränkung ist die Sperrung mir aus tun-ich erhalte eine Fehlermeldung:
Error #2176: Certain actions, such as those that display a pop-up window,
may only be invoked upon user interaction, for example by a mouse click
or button press.
Ich habe viele Dinge versucht, dies zu umgehen, wie das anlegen eines zweiten Maus-Klick-event-handler-Funktion, mit der FileReference.save () - Aufruf innerhalb und nannte es nach einem timeout-Intervall (geben Sie die web-service-Zeit), aber ich immer wieder mit den gleichen Fehler-vielleicht, dass der Ansatz funktioniert nicht, weil die zweite Funktion ist nicht registriert, wie ein Ereignis-listener für das Ereignis verwendet wird, als argument.
Ich bin neu in der Flex-Entwicklung so vielleicht bin ich nur nicht über dieses denken in der richtigen Weise. Wenn jemand vorschlagen kann, eine weitere Ansatz, den ich würde es wirklich schätzen. Vielen Dank im Voraus für Ihre Kommentare und Anregungen.
--James
InformationsquelleAutor James Adams | 2010-07-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Adobe hat dies als eine Art Sicherheitsmaßnahme, um sicherzustellen, dass die Benutzer sind diejenigen, die Durcheinander mit Dateien anstelle der potenziell schädlichen code. Mein Verständnis ist, dass Sie diese durchzusetzen, indem Behandler von (auf?) Ereignisse, die Ihren Ursprung von UI-Komponenten zur Ausführung der FileReference-Methoden, so erzeugen Sie Ihre eigenen Ereignisse programmgesteuert funktioniert nicht, obwohl ich habe nicht versucht, diese zu überprüfen. Leider ist die beste Auflösung, die ich gefunden habe, ist wieder Arbeit, die die UI ein wenig zu entsprechen dieser Vorgabe. In Ihrer jeweiligen situation, Sie könnte dies ein zwei Klick-Prozess mit einer Schaltfläche, die sagt so etwas wie "Bereite Download vor", die änderungen auf "Datei Herunterladen" nach der web-service abgeschlossen ist. Dies ist weniger als ideal aus der Sicht der Nutzer, aber ich glaube nicht, dass es viel anderes, das getan werden kann, es sei denn Sie können irgendwie vervollständigen Sie Ihre web-service-Aufruf vor dem anzeigen der Schaltfläche wird die FileReference.save () - Aufruf.
InformationsquelleAutor Wade Mueller
Nach kämpfen für, dass Sie für gut, ein paar Stunden fand ich eine Lösung: Sie kann sowohl die mouseDown-UND mouseUp-Ereignisse, statt nur zu klicken.
Zum Beispiel:
s:Button
mouseDown="prepare_PDF()"
mouseUp="save_PDF()"
Funktioniert gut für mich!
Happy coding!
--Thomas
Wenn prepare_PDF asynchron ist, wie es scheint, werden Sie in einer race-condition mit save_PDF. Was tun Sie in save_PDF wenn prepare_PDF noch nicht abgeschlossen noch?
InformationsquelleAutor Thomas
Als workaround, den ich verwendet die ExternalInterface-Klasse. Ich erstellt eine javascript-Funktion mit diesem code
In eine AS3-ich nenne
So mit, dass ich die übertragung der Datei-handling auf JS/HTML.
Ja, aber viele Leute wie mich, die am Ende auf "alte" threads aus google. Warum also nicht eine alternative zu einer anderen Antwort Suchenden wie mich?
Vereinbart. Ich kam hier aus eine Google-Suche, und wollen up-to-date Antworten, nicht nur die, die die OP gut gefallen!
InformationsquelleAutor havoc24k
Dies ist ein Kommentar auf Thomas' Antwort (ich habe nicht genug XP zu kommentieren noch):
mousedown
undmouseup
workaround funktioniert gut. Nur ein Hinweis, dass, wenn Sie änderungen inprepare_PDF()
müssen 'Verhängnis' insave_PDF()
, dann ist es eine gute Idee zu nennen, dass der code auf dermouseout
Ereignis, denn es könnte ein Fall, dass der Benutzer mousedown auf den button, aber dann bewegt sich die Maus Weg vom button.Dies war besonders relevant für meinen Fall, in dem wir erhöhen Sie die Größe des Wasserzeichens auf ein Bild klickt der Benutzer auf die download-Schaltfläche (ausgelöst, die
.save()
nennen). Ich reduzieren Sie die Größe des Wasserzeichens unten normal auf dermousedown
undmouseout
Veranstaltungen.der web-service-Aufruf ausgelöst wird on mouseUp, nicht mouseDown.
In Thomas' Beispiel
prepare_PDF
(genannt vonmouseDown
) ist der webservice-Aufruf, richtig? Dannsave_PDF
(genannt vonmouseUp
) ruft die FileReference.speichern.Es ist immer noch verwirrend, die Art, wie dieser geschrieben wird, wenn wir tun, eine RemoteObject-AMF nennen, wie können wir das nennen,
InformationsquelleAutor Jaffer
Ich hatte das gleiche Problem, ich wählte zu verwenden flash.net Methoden. Rufen Sie
flash.net.navigateToURL(url);
von einem actionscript-odernavigateToURL(url);
aus mxml.InformationsquelleAutor Sam
Was ich tun, um dieses Problem zu lösen, ist zu zeigen, wird eine Warnmeldung mit einer anonymen Funktion, so dass ich nicht haben, um eine Schaltfläche erstellen.
InformationsquelleAutor Carlos Castro