2010-11-18 8 views
0

Ok les gars et les filles,Comment définir la clé de cette baie?

Je travaille avec un site Web incroyable de mon client qui est écrit entièrement en actionscript 3.0 avec des références XML. Le concepteur précédent a mis en place un ensemble de fonctions qui est complètement nouveau pour moi, mais probablement une pratique normale pour ceux qui sont familiers avec la programmation basée sur c. De toute façon, il y a un sous-menu de navigation qui renseigne basée sur ce defenition tableau ... donc je suis face à un problème:

subnavData = new Array({"title":"OVERVIEW", "func":this.changeSlide, "param":this.showServices, "hasChild":true}, 
{"title":"CREATIVE DIRECTION", "func":this.changeSlide, "param":this.showBranding, "childOf":0}, 
{"title":"SOCIAL INTERACTIVE", "func":this.changeSlide, "param":this.showOnline, "childOf":0}, 
{"title":"LIVE EVENTS", "func":this.changeSlide, "param":this.showLiveEvents, "childOf":0}, 
{"title":"CONTENT STRATEGY", "func":this.changeSlide, "param":this.showPerformance, "childOf":0}, 
{"title":"PROCESS", "func":this.changeSlide, "param":this.showProcess}, 
{"title":"CASE STUDIES", "func":this.changeSlide, "param":this.showCaseStudies}, 
{"title":"CLIENTS", "func":this.changeSlide, "param":this.showClients} 
      ); 

l'élément de menu en haut a des enfants, donc ce qui en fait le numéro 0 dans le tableau .. Maintenant, la seule façon dont j'ai obtenu ce travail a été de mettre le "childOf" à "0", c'est la chaîne "0", pas la valeur 0. Je suis normalement un programmeur php, donc j'ai expérimenté problème particulier avec la tendance inhérente aux références au point 0 à ne pas enregistrer à partir d'autres fonctions. donc, c'est principalement ce que je crois être le problème ici, car la déclaration de chaîne de '0' ne fonctionne pas pour un processus itératif dans une autre fonction, car il attend un nombre et puisque 0 ne fonctionne pas pour moi, le menu ne s'affiche pas si je le définir comme ça ... voir? Donc, ce que je me demande, c'est comment je pourrais commencer la commande de 1 au lieu de 0 pour ce tableau. Je ne sais pas comment cela se fait lorsque chaque instance du tableau est contenue dans des accolades ({}). en php, je ferais quelque chose comme ça (hypothétiquement, si les valeurs contreventement ont été acceptées par php):

subnavData = array(1 => {"title":"OVERVIEW", "func":this.changeSlide, "param":this.showServices, "hasChild":true}, etc... );

mais lorsque vous essayez ce flash:

subnavData = new Array(1 => {"title":"OVERVIEW", "func":this.changeSlide, "param":this.showServices, "hasChild":true}, etc... );

il donne rien. aidez s'il vous plaît. Merci!

Répondre

0

bien que la syntaxe de votre tableau initial est un peu froussard (convention est de ne pas utiliser les littéraux de chaîne pour les noms de champ. Par exemple { title: 'mytitle'}, non {'title': 'mytitle'}), vous disposez d'un tableau valide d'objets. Comme mentionné précédemment, dans ActionScript, un Array ne peut pas avoir de clés personnalisées; Les clés d'éléments de tableau ne sont que des entiers qui pointent vers l'emplacement souhaité dans le tableau. Un Object est le type de données qui vous permet d'utiliser des noms de propriété personnalisés tels que obj.myPropName ou obj.title.

NE PAS fausser le positionnement du tableau, vous allez seulement dérouter le prochain développeur à toucher le code! :)

À partir de votre extrait, je suppose que la propriété childOf de vos objets est supposée faire référence à un index de tableau. Si c'est le cas, je parie que vous rencontrez des problèmes de vérification d'une valeur valide childOf.Si vous itérez à travers le réseau de vérifier chaque objet pour une propriété childOf valide comme ceci:

for(var i:int = 0, l:int = subnavData.length; i < l; i++) 
{ 
    if(subnavData[i].childOf) 
    { 
     trace(i + ' is child of ' + subnavData[i].childOf) 
    } 
} 

^traces rien

alors vous n'aurez pas de matchs. Mais clairement, vous avez plusieurs entrées avec un childOf = 0. La vérification booléenne if(subnavData[i].childOf) échouera si la valeur n'existe pas sur l'objet OU si elle est définie sur 0 (0 == false). vous devez faire une distinction entre 0 et undefined. En changeant votre relevé de chèque à: if(subnavData[i].childOf != undefined) vous pouvez faire cette distinction.

-à-dire)

for(var i:int = 0, l:int = subnavData.length; i < l; i++) 
{ 
    if(subnavData[i].childOf != undefined) 
    { 
     trace(i + ' is child of ' + subnavData[i].childOf) 
    } 
} 

^traces

1 is child of 0 
2 is child of 0 
3 is child of 0 
4 is child of 0 

Je prends un coup de poignard à ce que vous essayez d'accomplir, mais pense que je vois ce qui pourrait être vous trébucher. J'espère que ça aide :)

+0

merci beaucoup ... cela semble faire le plus de sens. J'apprécie votre temps et je vais donner un coup de feu. – Lucas

0

Je ne suis pas entièrement sûr de ce que vous voulez faire ici. Mais si vous voulez créer un tableau que vous pouvez commencer à compter à partir de 1, vous pouvez faire de l'élément 0 un tableau vide.

subnavData = new Array({}, {"title":"OVERVIEW", "func":this.changeSlide, "param":this.showServices, "hasChild":true}, etc...); 

Mais si vous êtes juste avoir des problèmes avec l'accès aux éléments dans le tableau multidimensionnel, la méthode standard pour faire en AS3 est:

something = subnavData[0][0]; 
someOtherThing = subnavData[0][1]; 
0

vous pouvez également charger le tableau comme celui-ci, sauter 0:

var subnavData:Array = new Array(); 
subnavData[1] = {"title":"OVERVIEW", "func":this.changeSlide, "param":this.showServices, "hasChild":true}; 
subnavData[2] = {"title":"CREATIVE DIRECTION", "func":this.changeSlide, "param":this.showBranding, "childOf":0} 
subnavData[3] = etc... 

Et d'ailleurs dans flash {} crée un objet, pas un tableau. Vous créez donc un tableau en 1 dimension avec des objets pour les valeurs.Donc, pour accéder à ces données, il ressemblerait à ceci:

subnavData[1].title; 
// or you can do this 
subnavData[1]['title'] 
0

ces accolades dans le tableau représentent un nouvel objet:

subnavData = new Array({"title":"OVERVIEW", "func":this.changeSlide}); 

peut également être écrit comme celui-ci (mais ne serait habituellement pas car il est bavard):

var navObject:Object = new Object(); 
navObject["title"] = "OVERVIEW"; 
navObject["func"] = this.changeSlide; 

subnavData = new Array(navObject); 

il est en fait plus courant d'écrire des clés d'objet sans les guillemets (bien que dans certaines situations, il peut être utile ou nécessaire):

subnavData = new Array({title:"OVERVIEW", func:this.changeSlide}); 

ou moins laconique avec l'opérateur point:

var navObject:Object = new Object(); 
navObject.title = "OVERVIEW"; 
navObject.func = this.changeSlide; 

subnavData = new Array(navObject); 
0

La classe Object est la classe de base en AS3, à certains égards, semblable à stdClass en PHP. Vous pouvez créer un nouvel objet de deux façons.

var object:Object = new Object(); 
    var object:Object = {}; 

Vous pouvez attribuer des propriétés dynamiquement, comme ceci:

object.title = "OVERVIEW"; 
    // or this 
    object = {title: "OVERVIEW" , ...}; // as in your example 

    //you could also use the Array notation 
    //but it is believed to be a lot slower 
    object["title"] = "OVERVIEW"; 

Vous n'avez pas vraiment besoin de jouer avec la matrice, mais vous pouvez facilement changer la propriété childOf si vous n'êtes pas à l'aise avec la valeur 0 Dans votre cas, 0 est un entier, donc quand vous itérer à travers les propriétés des objets, ce qui suit devrait fonctionner:

for each(var obj:Object in subnavData) 
    { 
     if(obj.childOf == 0) 
      //do whatever 

    } 

Mais si vous modifiez la propriété childOf à la « VUE D'ENSEMBLE », par exemple, vous pouvez le faire:

for each(var obj:Object in subnavData) 
    { 
     if(obj.childOf == "OVERVIEW") 
     //do whatever    
    } 

changer pratiquement la propriété childOf à ce que vous êtes à l'aise avec (à condition bien sûr que ce n'est pas utilisé nulle part ailleurs !!! va de même pour l'indexation de tableau par la voie), bien que l'utilisation 0 comme un entier devrait travailler ici. Pouvez-vous poster un exemple du code que vous utilisez lorsque vous parcourez le tableau?