Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    14

    AC3 - come tirare fuori un valore da un funzione listener?

    Ciao a tutti,

    sono nuovo su questo forum, in genere non scrivo post perchè trovo già tutto l'aiuto che mi serve dai post lasciati dagli altri, ma questa volta mi sono imbattuto in un problema veramente strano a cui non riesco a trovare soluzione, spero qualcuno qui possa aiutarmi.

    Ho una pagina dinamica asp che mi genera una query string, e utilizzo due classi per caricare questa query string e averla disponibile sullo stage. La document class non mi da problemi, la seguente classe invece che è istanziata all'interno della document class mi da uno strano problema, ecco il codice della classe incriminata:

    package com.utils {
    import flash.display.Sprite;
    import flash.events.*;
    import flash.net.*;
    import flash.text.TextField;

    public class URLLoaderExample extends Sprite {
    public var imgPathValue:String;
    //COSTRUTTORE
    public function URLLoaderExample(url:String) {
    var loader:URLLoader = new URLLoader();
    imgPathValue=new String();
    configureListeners(loader);
    var request:URLRequest = new URLRequest(url);
    try {
    loader.load(request);
    trace("fuori la funzione " + imgPathValue);
    } catch (error:Error) {
    trace("Unable to load requested document.");
    }
    }
    private function configureListeners(dispatcher:IEventDispatcher):vo id {
    dispatcher.addEventListener(Event.COMPLETE, completeHandler);
    }
    private function completeHandler(event:Event):void {
    imgPathValue = new String(event.target.data);
    trace("dentro la funzione " + imgPathValue);
    }
    }
    }

    Una volta lanciata la document class, questa chiama la classe che ho riportato sopra passandogli un url da dove prendere una stringa.
    L'Output dei due comandi trace inseriti nel costruttore e nella funzione di listener è il seguente:

    fuori la funzione
    dentro la funzione imgPath=img/img_home/image11.jpg

    Come potete vedere la stringa "imgPath=img/img_home/image11.jpg" è correttamente caricata all'interno della funzione completeHandler e una volta che assegno questa stringa alla variabile "imgPathValue" il trace al suo interno ne riporta correttamente il valore, ma quando il controllo ripassa al costruttore la variabile imgPathValue è inspiegabilmente non più valorizzata!

    Ho provato ad usare anche la notazione "this.imgPathValue" ma senza risultato.

    Qualcuno puoi aiutarmi?

    Grazie in anticipo
    Adolfo

  2. #2
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Non si tratta effettivamente di un problema, ma di un comportamento normale quando si ha a che fare con linguaggi come actionscript che lavorano in maniera asincrona.
    In pratica per ottenere dei dati caricati dall'esterno e poterli utilizzare all'interno di flash, senza doversi spostare di frame o ricaricare la pagina (come faresti con html se dovessi richiamare dei dati diversi nella stessa pagina), si utilizzano gli eventi, canalizzati normalmente all'interno di funzioni specifiche.
    Nel nostro caso, ad esempio, l'evento attivato dal caricamento esterno sarà "COMPLETE", e solo dentro la funzione corrispondente, impostata nell'addEventListener è possibile gestire le variabili recuperate dall'esterno.
    Ora, considerato che la tua è una classe esterna, puoi utilizzare il metodo dispatchEvent all'interno della classe per creare un canale per l'evento COMPLETE da usare sulla classe stessa quando ti serve dentro la document class.

    codice:
    package com.utils {
    	import flash.display.Sprite;
    	import flash.events.*;
    	import flash.net.*;
    	import flash.text.TextField;
    	public class URLLoaderExample extends Sprite {
    		public var imgPathValue:String;
    		//COSTRUTTORE
    		public function URLLoaderExample(url:String) {
    			var loader:URLLoader = new URLLoader();
    			imgPathValue=new String();
    			configureListeners(loader);
    			var request:URLRequest = new URLRequest(url);
    			try {
    				loader.load(request);
    				trace("fuori la funzione " + imgPathValue);
    			} catch (error:Error) {
    				trace("Unable to load requested document.");
    			}
    		}
    		private function configureListeners(dispatcher:IEventDispatcher):void {
    			dispatcher.addEventListener(Event.COMPLETE, completeHandler);
    		}
    		private function completeHandler(event:Event):void {
    			imgPathValue = new String(event.target.data);
    			trace("dentro la funzione " + imgPathValue);
    			dispatchEvent(event);
    		}
    		public function get imgPathValue ():String {
    			return imgPathValue;
    		}
    	}
    }
    Dentro alla document class dovrai creare un'istanza di URLLoaderExample e poi gli associerai l'evento COMPLETE.

    Codice PHP:
    var myUL:URLLoaderExample = new URLLoaderExample ("test.php");
    myUL.addEventListener(Event.COMPLETEcompleteHandler);
    function 
    completeHandler (evt:Event) {
        
    trace(evt.target.imgPathValue); // restituisce: img/img_home/image11.jpg


  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    14
    Ciao and80,

    innanzitutto grazie per la risposta.
    Ho provato ad applicare il tuo codice, in realtà il problema mi si è semplicemente translato dalla funzione completeHandler che stava all'interno della classe URLLoaderExample alla funzione completeHandler che sta nella document class.
    Adesso all'interno della funzione completeHandler della document class effettivamente vedo imgPathValue correttamente valorizzata, ma quando tento di usarla all'esterno di questa funzione negli altri metodi della document class mi ritorna ad avere valore null.

    Non c'è proprio modo di tirare fuori questa variabile dal contesto di completeHandler? oppure devo gestire tutta la parte di codice che utilizza imgPathValue per forza all'interno di questa funzione?

    Grazie
    Adolfo

  4. #4
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    devo gestire tutta la parte di codice che utilizza imgPathValue per forza all'interno di questa funzione?
    esattamente, però in questo modo puoi gestire le azioni direttamente sulla document class

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    14
    ok farò così allora

    grazie!
    Adolfo

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    14
    Vorrei un attimo ritirare fuori questo argomento. Lavorando un pò di più con AS3 ho visto che è tutto basato su eventi.
    Per esempio se si fa una applicazione che deve leggere all'inizio un file di properties e poi basandosi sui valori caricati, fare il suo lavoro, come è possibile che tutta l'architettura dell'applicazione debba per forza essere inglobata nella funzione target all'evento che segnala il "load complete" del file di properties e che non ci sia un modo per leggere questi valori fuori da quella funzione?
    insomma per un linguaggio moderno come AS3 questa cosa mi sembra davvero incredibile, non c'è davvero nessun altro metodo per lavorare con i valori caricati fuori dalla funzione? se no come si fa a gestire tutta una applicazione che si basa su quei valori?

    grazie a tutti e spero di aver dato un buono spunto di discussione generale.

    Adolfo

  7. #7
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Ma in realtà è fondamentale per un linguaggio web moderno poter sfruttare gli eventi, altrimenti anche ajax non avrebbe ragione di esistere. La chiave di una navigazione fluida e definita in una sola pagina sta proprio nel fatto di non dover ricaricare quella pagina per cambiarne i contenuti, evitando le attese di ricaricamento della pagina stessa, riducendo il consumo di banda e dando all'utente un'esperienza di navigazione più gradevole e continua. Ma è una cosa che sul browser non potresti sfruttare se non con una gestione asincrona degli eventi.

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    14
    Ciao and80,
    dal punto di vista prestazionale hai perfettamente ragione, ma come si sposa tutto questo con il fatto di gestire il codice di una applicazione in maniera pulita? se parliamo del programmino che calcola il codice fiscale non è un problema, ma se iniziamo a realizzare grossi progetti (per cui as3 è stato pensato) l'architettura sporca a cui obbligano gli eventi rende l'approccio OO quasi inapplicabile e ne fa perdere il senso... non sò se su questo punto sei d'accordo

    grazie
    Adolfo

  9. #9
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    Personalmente non sono d'accordo, anzi trovo che il punto di forza del linguaggio sia proprio insito nella gestione degli eventi, sopratutto quando si utilizza a pieno il supporto OOP.
    Mi faresti un esempio di quello che intendi quando dici che l'approccio OOP è inapplicabile?

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    14
    L'esempio è quello che avevo accennato qualche post fà. Se hai una classe addetta a caricare dei file di properties in una applicazione molto grande che fa svariate cose, puoi utilizzare i valori caricati solo all'interno della funzione successiva all'evento LOAD_COMPLETE, quindi tutte le operazioni che utilizzano questi valori dovranno per forza di cose essere eseguite da lì (quindi magari all'interno di questa funzione faccio le cose più diverse e svariate).
    Questo cozza terribilmente con un principio principe dell'approccio OO, quelo dell'INCAPSULAMENTO secondo cui per assicurarci che il programma lavori correttamente ogni oggetto deve rappresentare in modo corretto il concetto di cui è modello e la distinzione tra i compiti dei vari oggetti deve essere chiara.
    Detto questo resto d'accordo con te sulle potenzialità di un approccio basato su eventi stile as3, ma la chiarezza architetturale non è certo il suo maggior pregio...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.