2010-05-06 5 views
0

im ayant des problèmes avec le code suivant:AS3 paramètre passe par la valeur

for (var i:Number=0; i<numFaces;i++){ 
    var faceLoader:Loader = new Loader(); 
    faceLoader.contentLoaderInfo.addEventListener(Event.INIT, 
    function(fle:Event){ 
     LoadCara(i,faceLoader); 
     trace("LoadCara:" + i.toString()); 
    }); 
} 

function LoadCara(index:int,loader:Loader){ 
    if(index == 0) 
    { 
    trace("cara1:" + index.toString()); 
    cara1.removeChildAt(0); 
    cara1.addChild(loader); 
    } 
    else if(index == 1) 
    { 
    cara2.removeChildAt(0); 
    cara2.addChild(loader); 
    }} 

Le problème est que im envoyer la variable i à la fonction LoadCara à chaque itération, et est toujours appelé à la dernière valeur de i . Je voudrais que cette fonction soit appelée avec l'index approprié. J'espère que je m'explique, merci d'avance.

Répondre

0

Il ne s'agit pas de "passer des paramètres par valeur" ou non. La fonction de gestionnaire d'événements que vous déclarez n'accède pas à la variable i en tant que paramètre. C'est pourquoi la valeur de i n'est pas déterminée par la boucle for.

Il y a plusieurs façons de gérer cette situation. Vous pouvez créer une nouvelle classe qui étend Event et y ajouter votre valeur d'index. OU Vous pouvez créer un tableau ou stocker les facesLoaders avec l'index dont vous avez besoin. Puis appelez LoadCara() avec l'index correct en recherchant l'index correspondant dans le tableau.

0

Il y a une autre façon d'atteindre what you want il est pas toujours souhaitable, mais parfois à portée de main ...

1

Le contenu de la fonction appartient à la fonction, ne pas utiliser des variables à l'extérieur de celui-ci. Comme cara1 et cara2, que i ne pas appartenir à la fonction où vous l'utilisez.

Mais pour corriger votre code est simple:

for (var i:Number = 0; i < numFaces; i++) { 
    var fLoader:Loader = new Loader(); 
    fLoader.contentLoaderInfo.addEventListener(Event.INIT, LoadCara(i, fLoader)); 
    trace("LoadCara:" + i.toString()); 
} 

function LoadCara(index:int, loader:Loader):Function { 
    return function(fle:Event):void { 
    if (index == 0) { 
     trace("cara1:" + index.toString()); 
     cara1.removeChildAt(0); 
     cara1.addChild(loader); 
    } else if (index == 1) { 
     cara2.removeChildAt(0); 
     cara2.addChild(loader); 
    } 
    } 
} 

Si vous voulez être en mesure d'utiliser removeEventListener() plus tard, ajuster la boucle:

var functionsLoadCara:Object = new Object(); 
for (var i:Number = 0; i < numFaces; i++) { 
    var fLoader:Loader = new Loader(); 
    functionsLoadCara[i] = LoadCara(i, fLoader); 
    fLoader.contentLoaderInfo.addEventListener(Event.INIT, functionsLoadCara[i]); 
    trace("LoadCara:" + i.toString()); 
} 

Ensuite, lorsque vous n'avez pas besoin l'écouteur de l'événement plus, faire:

for (var i:Number = 0; i < numFaces; i++) { 
fLoader.contentLoaderInfo.removeEventListener(Event.INIT, functionsLoadCara[i]); 
} 

Cette façon de passer vos paramètres est plus sûr. Il est mieux illustré dans this answer.

Questions connexes