Devo chiamare FileReference.save() dopo che una chiamata al servizio web è stata completata, ma questo metodo ha una restrizione: "In Flash Player, è possibile chiamare questo metodo solo in risposta a un evento utente (ad esempio, in un gestore di eventi per un clic del mouse o un evento keypress), altrimenti, chiamando questo metodo, Flash Player genera un'eccezione di errore. " (dalla documentazione here)Flex's FileReference.save() può essere chiamato solo in un gestore di eventi utente - come posso aggirare questo?
Questa restrizione è un po 'vaga. Significa che posso solo chiamare il metodo FileReference.save() all'interno di una funzione di gestore eventi registrata come listener per determinati tipi di eventi utente? Se è così allora esattamente quali eventi utente sono validi? (Forse c'è un evento che non verrà mai inviato dall'interazione dell'utente con la mia applicazione e potrei registrare una funzione di gestore di eventi per quel tipo di evento e effettuare la chiamata save() da quella funzione?)
La mia difficoltà è che io impossibile chiamare il metodo FileReference.save() fino a quando il mio servizio web non ritorna con i dati che verranno utilizzati come argomento della chiamata al metodo FileReference.save(), quindi l'evento che attiva la chiamata FileReference.save() è in realtà un evento ResultEvent piuttosto che un evento utente e sono lieto di inviare un nuovo tipo di evento utente (falso) per poter attivare la chiamata FileReference.save() a meno che non si tratti di un evento utente che non verrà mai inviato come un risultato dell'interazione dell'utente con la mia applicazione.
In poche parole quello che sto facendo ora è questo: ho una funzione che è registrata come gestore per un clic del pulsante. In questa funzione faccio la mia chiamata al servizio web per recuperare i dati dal server. Ho anche una funzione di gestione dei risultati che viene richiamata al termine della chiamata al servizio web, ed è qui che voglio chiamare il metodo FileReference.save() poiché è a questo punto che so che i dati sono pronti per essere salvati in un file. Ma la limitazione di cui sopra mi sta bloccando dal fare questo - ottengo un errore:
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.
Ho provato molte cose per ottenere intorno a questo come ad esempio la creazione di una seconda funzione gestore di eventi click del mouse con il FileReference.save () chiama e chiama dopo un intervallo di timeout (per dare il tempo di completamento del servizio web), ma continuo a correre nello stesso errore - forse quell'approccio non funziona poiché la seconda funzione non è registrata come listener di eventi per il tipo di evento utilizzato come argomento.
Sono nuovo nello sviluppo di Flex, quindi forse non sto pensando a questo nel modo giusto. Se qualcuno può suggerire un altro approccio, lo apprezzerei molto. Grazie in anticipo per i vostri commenti o suggerimenti.
--James
Questo è corretto. Ci si aspetta che le applicazioni Flash basate sul browser obbediscano alle normali regole sandbox del browser. Un'altra opzione potrebbe essere l'utilizzo di Adobe AIR che esce dalla sandbox del browser (ma richiede all'utente di installare l'app). –