2010-05-05 19 views
1

j'avais posté ma question en réponse à cette question: How to get associated URLRequest from Event.COMPLETE fired by URLLoaderflash AS 3 Loader OnComplete intérieur d'une boucle

Désolé. Voici ma question encore:


Salut, Comment est-ce que je peux faire fonctionner votre fonction pour l'objet de chargeur dans une boucle? Merci! Meengla Voici mon code (approximatif) existant; Je reçois toujours le mylabel du dernier élément du tableau.

var _loader = new Loader(); 
for (j = 0; j < 5; j++) { 
    //mylabel variable is correct setup in the loop 
    _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(e:Event):void { 
     doneLoad(e, mylabel); 
    }); 

    _loader.load(new URLRequest(encodeURI(recAC[j].url))); 

}//for loop 
+0

Votre code tente d'assigner le EventHandler pour l'événement onComplete 5 fois. Pouvez-vous élaborer sur ce que vous essayez de faire? Votre tableau n'est pas référencé ici ... juste un petit bout de code qui s'exécute 5 fois. Je pense qu'un peu plus de votre code doit être visible pour que des suggestions soient faites. Vous ne laissez pas non plus votre chargeur initial terminer quoi que ce soit - en appelant _loader.load() sur le même objet encore et encore, vous annulez effectivement la demande de chargement précédente. – liquidleaf

+0

Vous pouvez mettre la déclaration de var _loader = new Loader(); Dans la boucle for - de cette façon, vous aurez créé 5 objets loader au lieu d'essayer d'en utiliser un pour tous les 5 objets. Il semble y avoir une certaine confusion sur la façon dont les auditeurs d'événements fonctionnent - encore une fois, un peu plus de détails aiderait. – liquidleaf

+0

Merci! J'essaie d'assigner des objets dynamiques 'Image()' à des données d'octets provenant d'images distantes.Je transmets aussi des valeurs de 'mylabel' qui sont assignées d'un tableau recAC à un champ label. Je pense fondamentalement, si vous pouvez me dire à qui de réutiliser le \t http://stackoverflow.com/questions/2338317/how-to-get-associated-urlrequest-from-event-complete-fired-by-urlloader afin que cela fonctionne pour un objet 'loader', cela sera d'une grande aide. Plus précisément, la ligne: xmlURLLoader.addEventListener (Event.COMPLETE, fonction (req: URLRequest): Fonction { – meengla

Répondre

1

Selon les commentaires ci-dessus, cela ne fonctionnera pas parce que:

1) Vous êtes juste d'ajouter le même événement auditeur 5 fois au chargeur. 2) Vous venez de réinitialiser votre même objet chargeur 5 fois.

La sortie finale sera comme si vous l'aviez seulement appelée la dernière fois.

Il y a différentes façons de résoudre ce problème - charger les choses de manière asynchrone est l'un des grands cerveaux de l'apprentissage du code - mais le plus simple est probablement de créer cinq chargeurs distincts.

je ferais quelque chose comme ceci:

var loaders:Array = []; 
var labels:Array = ["label1", "label2", "label3", "label4", "label5"]; 
for (var j:int = 0; j < 5; j++) { 
loaders[j] = new Loader(); 
loaders[j].contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); 
loaders[j].load(new URLRequest(encodeURI(recAC[j].url))); 
} 

function completeHandler(e:Event):void { 
doneLoad(e.currentTarget, labels[loaders.indexOf(e.currentTarget)]); 
} 

La partie déroutante est de trouver une bonne façon de garder une trace dont la charge est associée à quelle étiquette etc, car en théorie vos charges peuvent terminer dans l'ordre . C'est pourquoi j'ai un tableau d'étiquettes séparé là-bas, et alors vous venez de faire correspondre l'étiquette souhaitée avec le chargeur qui vient de terminer le chargement.

J'espère que cela aide!

+0

Salut, je pense que je suis proche! Mais cette expression n'est pas résolue, selon Flex débogueur: étiquettes [loaders. indexOf (e.currentTarget)]); – meengla

+0

Hmm, ça devrait être ... Les tableaux ont la méthode indexOf() qui retourne l'index de l'élément que vous transmettez, s'il se trouve dans le tableau. Vous ne savez pas ce que cela ferait que ça ne marche pas? Il existe d'autres moyens de résoudre ce problème - vous pourriez utiliser une instance de dictionnaire, par exemple. Dans votre boucle, dict [loaders [j]] = labels [j] puis dans votre gestionnaire quelque chose comme: doneLoad (e.currentTarget, dict [e.currentTarget]) Un million de façons de le résoudre, mais cela ressemble tu es proche. Joue juste avec. :) – Myk

+0

Oui, le tableau 'loaders' a un tas d'objets 'loader' mais la correspondance devrait être exacte dans le cas où indexOf() – meengla

0

la ligne belove devrait fonctionner mais elle renvoie -1, toujours. loaders.indexOf (e.currentTarget);

Voici mon code

pour (i, i < totale; i ++) { imgLoaderArray [i] = new Loader(); imgLoaderArray [i] .contentLoaderInfo.addEventListener (IOErrorEvent.IO_ERROR, urlError);
imgLoaderArray [i] .contentLoaderInfo.addEventListener (Event.COMPLETE, chargé); imgLoaderArray [i] .load (nouvelle URLRequest (xmlList [i] .image)); }

fonction chargée (e: Event): void { trace ("index:" + imgLoaderArray.indexOf (e.currentTarget)); // Renvoie -1 à chaque fois }