Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [AS 2.0] Mostrare i dati solo dopo il caricamento

    Forse il titolo del thread non è chiarissimo, cercherò di essere più chiaro: mi son fatto una classe per la gestione del caricamento di dati da file xml, e il suo lavoro lo fa anche discretamente bene, il problema però è che una volta richiamata la classe, i dati non li ho immediatamente, ma li recupero solo nel frame successivo, ad esempio se nel frame 1 nell'action metto:

    this.stop();
    var SiteVars:ReadXmlData = new ReadXmlData();
    SiteVars.SetFileToLoad("miodoc.xml");
    Gino = SiteVars.ReadData();
    trace(Gino[0][0]);

    e il trace mi da undefined, mentre se metto il trace nel frame successivo mi restituisce il valore corretto.

    la funzione ReadData() nella classe ReadXmlData è all'incirca così
    codice:
    public function ReadData():Array{
    		var  XmlData:XML = new XML();
    		 XmlData.ignoreWhite = true;
    		 XmlData.load(XmlUrl);
                     XmlData.onLoad = function(success){
                         if(success){
    //qua eseguo tutto il codice per la lettura dell'xml                       
    		     } 			
    		}	
    		return XmlDataA;
    	};
    Come posso fare in modo che il return sia fatto solo quando i dati sono effettivamente caricati?

  2. #2
    Hai provato così?

    public function ReadData():Array{
    var XmlData:XML = new XML();
    XmlData.ignoreWhite = true;
    XmlData.load(XmlUrl);
    XmlData.onLoad = function(success){
    if(success){
    //qua eseguo tutto il codice per la lettura dell'xml
    }
    return XmlDataA;
    }

    };

    Cioè spostando il return praticamente dopo la lettura del codice Xml ?
    In teoria così dovrebbe essere eseguito appunto quando l'xml è stato letto, mentre prima era eseguito "troppo presto"

  3. #3
    Originariamente inviato da Broly
    Hai provato così?

    public function ReadData():Array{
    var XmlData:XML = new XML();
    XmlData.ignoreWhite = true;
    XmlData.load(XmlUrl);
    XmlData.onLoad = function(success){
    if(success){
    //qua eseguo tutto il codice per la lettura dell'xml
    }
    return XmlDataA;
    }

    };

    Cioè spostando il return praticamente dopo la lettura del codice Xml ?
    In teoria così dovrebbe essere eseguito appunto quando l'xml è stato letto, mentre prima era eseguito "troppo presto"
    Ho provato ma il problema è che definendo l'output di ReadData come Array, se sposto il return dentro l'onLoad, il parser AS mi genera errore

    **Errore** E:\Alessio\Experiment\Flash Experiment\AS 2.0\ReadXmlData.as: Linea 34: Istruzione di restituzione necessaria in questa funzione.
    public function ReadData():Array{

    Totale errori ActionScript: 1 Errori segnalati: 1

  4. #4
    Utente di HTML.it L'avatar di negatyve
    Registrato dal
    Feb 2001
    Messaggi
    9,479
    Semplicemente devi gestire la cosa con un sistema di dispaccio dell'evento:

    codice:
    this.stop();
    var SiteVars:ReadXmlData = new ReadXmlData();
    SiteVars.SetFileToLoad("miodoc.xml");
    
    var Gino = new Object();
    Gino.loaded = function(evt)
    {
    	trace(evt)
    }
    SiteVars.addEventListener("loaded", Gino);
    SiteVars.load();
    codice:
    import mx.events.EventDispatcher
    
    class ReadXmlData
    {
    	static var initialized = EventDispatcher.initialize(ReadXmlData.prototype);
    	static var evtDispatcher = EventDispatcher;
    	public var addEventListener : Function;
    	private var dispatchEvent : Function;
    
    	private var XmlUrl:String;
    	public function SetFileToLoad(url:String):Void
    	{
    		XmlUrl = url;
    	}
    	public function load()
    	{
    		var path:Object = this;
    		var XmlData:XML = new XML();
    		XmlData.ignoreWhite = true;
    		XmlData.onLoad = function(success)
    		{
    			if (success) {
    				path.dispatchEvent({type:"loaded", content:this.firstChild.childNodes});
    			}
    		};
    		XmlData.load(XmlUrl);
    	}
    }

  5. #5
    import mx.events.EventDispatcher

    che cos'è?

  6. #6
    Aggiungo inoltre che la funzione restituisce un array bidimensionale e che la struttura dell'xml è così

    <xml>
    <pippo>
    <elemento>prova1</elemento>
    </pippo>
    <pluto>
    <elemento>prova2</elemento>
    <elemento>prova3</elemento>
    <elemento>prova4</elemento>
    </pluto>
    </xml>

    quindi se richiamo Gino[0][0] mi deve stampare "prova1"

  7. #7
    Utente di HTML.it L'avatar di negatyve
    Registrato dal
    Feb 2001
    Messaggi
    9,479
    >che cos'è

    Una Classe che permette la gestione di eventi personalizzati, come l'evento "loaded".

    >quindi se richiamo Gino[0][0] mi deve stampare "prova1"

    codice:
    this.stop();
    var SiteVars:ReadXmlData = new ReadXmlData();
    SiteVars.SetFileToLoad("miodoc.xml");
    
    var listener = new Object();
    listener.loaded = function(evt)
    {
    	Gino = new Array();
    	for(var i = 0; i < evt.content.length; i++){
    		Gino[i] = new Array();
    		for(var j = 0; j < evt.content[i].childNodes.length; j++){
    			Gino[i].push(evt.content[i].childNodes[j].firstChild.nodeValue);
    		}
    	}
    	trace(Gino[0][0]);
    }
    SiteVars.addEventListener("loaded", listener);
    SiteVars.load();

  8. #8
    Originariamente inviato da negatyve
    >che cos'è

    Una Classe che permette la gestione di eventi personalizzati, come l'evento "loaded".

    >quindi se richiamo Gino[0][0] mi deve stampare "prova1"

    codice:
    this.stop();
    var SiteVars:ReadXmlData = new ReadXmlData();
    SiteVars.SetFileToLoad("miodoc.xml");
    
    var listener = new Object();
    listener.loaded = function(evt)
    {
    	Gino = new Array();
    	for(var i = 0; i < evt.content.length; i++){
    		Gino[i] = new Array();
    		for(var j = 0; j < evt.content[i].childNodes.length; j++){
    			Gino[i].push(evt.content[i].childNodes[j].firstChild.nodeValue);
    		}
    	}
    	trace(Gino[0][0]);
    }
    SiteVars.addEventListener("loaded", listener);
    SiteVars.load();
    Ma se non sbaglio in quel modo va a leggere l'xml, invece io l'xml l'ho già letto e la funzione ReadData mi restituisce l'array.
    Mi sa che non ci sto capendo nulla, quindi per completezza provo a postare la classe

    codice:
    mport mx.events.EventDispatcher
    
    class ReadXmlData{
    	
    	static var initialized = EventDispatcher.initialize(ReadXmlData.prototype);
    	static var evtDispatcher = EventDispatcher;	
    	
    	public var XmlUrl:String,
    			 XmlDataA:Array = new Array(),
    			 XmlCategory:String,
    			 addEventListener : Function;
    			 
    	private var dispatchEvent : Function;
    		
    	//Costruttore	
    	function ReadXmlData(){
    		XmlDataA = Array("");
    	}
    	
    	
    	//Funzione che setta il file XML di origine dati
    	public function SetFileToLoad(XmlUrl:String):Void{
    		this.XmlUrl = XmlUrl;
    	}
    	
    	
    	//Funzione che imposta la categoria da leggere nel file XML
    	public function SetCategory(XmlCategory:String):Void{
    		this.XmlCategory = XmlCategory;
    	}
    	
    	
    	//Funzione che legge i dati dal file XML e ne restituisce l'array, 
    	public function ReadData(){
    		var  XmlData:XML = new XML();
    		 XmlData.ignoreWhite = true;		
    		 var path:ReadXmlData = this;
    		 XmlData.onLoad = function(success){		 
    			if(success){
    				var base:XMLNode = this.childNodes[0];
    				//controllo se è stata impostata una categoria, nel qual caso seleziono i dati della categoria selezionata
    				if(path.XmlCategory != "" || path.XmlCategory != null){
    					var Section:Number = new Number(0);
    					//Scorro il file xml
    					for(var i:Number = 0;i < base.childNodes.length;i++){
    						//Se trovo il nodo con il nome della categoria scelta, mi salvo l'id del nodo
    						if(base.childNodes[i].nodeName == path.XmlCategory){
    							Section = i;
    						}
    					}
    					//Reimposto il path base con l'aggiunta del nuovo nodo
    					base = base.childNodes[Section];
    				}
    				for(var i:Number = 0;i < base.childNodes.length;i++){
    					var sub:XMLNode  = base.childNodes[i];
    					//trace(sub.childNodes.length);
    					var ArrLine:String = new String();
    					path.XmlDataA[i] = Array();
    					for(var j:Number = 0; j < sub.childNodes.length; j++){					
    						//Inserisco le informazioni nell'array
    						path.XmlDataA[i][j] = sub.childNodes[j].firstChild.nodeValue;
    					}
    				}	
    				path.dispatchEvent({type:"loaded", content:XmlDataA});
    				//return XmlDataA;
    			} 			
    		}	
    		 XmlData.load(XmlUrl);
    	
    	};
    }

  9. #9
    Utente di HTML.it L'avatar di negatyve
    Registrato dal
    Feb 2001
    Messaggi
    9,479
    Indipendentemente da come è fatta la tua classe, non puoi comunque chiamare una funzione che avvia il caricamento di un contributo esterno e aspettarti che questa possa restituirne il valore. Devi chiamare una funzione che avvia il caricamento, e predisporne un'altra che viene chiamata a caricamento ultimato.

    Detto questo, c'era qualche errore, soprattutto quel

    XmlDataA = Array();

    codice:
    this.stop();
    var SiteVars:ReadXmlData = new ReadXmlData();
    SiteVars.SetFileToLoad("miodoc.xml");
    SiteVars.SetCategory("elemento");
    var listener = new Object();
    listener.loaded = function(evt)
    {
    	Gino = evt.content;
    	trace(Gino[0][0]);
    }
    SiteVars.addEventListener("loaded", listener);
    SiteVars.ReadData();
    codice:
    import mx.events.EventDispatcher
    
    class ReadXmlData{
    
    	static var initialized = EventDispatcher.initialize(ReadXmlData.prototype);
    	static var evtDispatcher = EventDispatcher;
    
    	public var XmlUrl:String,
    			 XmlDataA:Array,
    			 XmlCategory:String,
    			 addEventListener : Function;
    
    	private var dispatchEvent : Function;
    
    	//Costruttore
    	function ReadXmlData(){
    		XmlDataA = new Array();
    	}
    
    
    	//Funzione che setta il file XML di origine dati
    	public function SetFileToLoad(XmlUrl:String):Void{
    		this.XmlUrl = XmlUrl;
    	}
    
    
    	//Funzione che imposta la categoria da leggere nel file XML
    	public function SetCategory(XmlCategory:String):Void{
    		this.XmlCategory = XmlCategory;
    	}
    
    
    	//Funzione che legge i dati dal file XML e ne restituisce l'array,
    	public function ReadData(){
    		var  XmlData:XML = new XML();
    		 XmlData.ignoreWhite = true;
    		 var path:ReadXmlData = this;
    		 XmlData.onLoad = function(success){
    			if(success){
    				var base:XMLNode = this.childNodes[0];
    				//controllo se è stata impostata una categoria, nel qual caso seleziono i dati della categoria selezionata
    				if(path.XmlCategory != "" || path.XmlCategory != null){
    					var Section:Number = new Number(0);
    					//Scorro il file xml
    					for(var i:Number = 0;i < base.childNodes.length;i++){
    						//Se trovo il nodo con il nome della categoria scelta, mi salvo l'id del nodo
    						if(base.childNodes[i].nodeName == path.XmlCategory){
    							Section = i;
    						}
    					}
    					//Reimposto il path base con l'aggiunta del nuovo nodo
    					base = base.childNodes[Section];
    				}
    				for(var i:Number = 0;i < base.childNodes.length;i++){
    					var sub:XMLNode  = base.childNodes[i];
    					path.XmlDataA[i] = Array();
    					for(var j:Number = 0; j < sub.childNodes.length; j++){
    						//Inserisco le informazioni nell'array
    						path.XmlDataA[i][j] = sub.childNodes[j].nodeValue;
    					}
    				}
    				path.dispatchEvent({type:"loaded", content:path.XmlDataA});
    				//return XmlDataA;
    			}
    		}
    		 XmlData.load(XmlUrl);
    
    	};
    }

  10. #10
    Intendi questo?

    path.XmlDataA[i] = Array();

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.