2010-11-14 58 views
0

Je suis relativement nouveau pour javascript. J'utilise le SDK titanium d'appcelerator pour créer une application mobile, et il utilise uniquement javascript.Utilisation d'une chaîne pour cibler un objet

De toute façon, j'ai un système de menu hiérarchique que je crée. J'ai des tableaux de données remplis d'éléments de sous-menu. Chaque tableau de données est rempli avec un sous-menu différent. Lorsque je clique sur un élément de menu, il reçoit une variable qui permet à l'application de connaître le tableau de données à charger ensuite. Voici un exemple de base:

var data = [ 
    {title:'Item 1',subID:'1', hasDetail:true,}, 
    {title:'Item 2',subID:'1', hasDetail:true,} 
]; 

var data1 = [ 
    {title:'Child1',subID:'1_1', hasDetail:true}, 
    {title:'Child2', subID:'1_2', hasDetail: true} 
]; 

var data1_1 = [ 
    {title:'Grandchild1'}, 
    {title:'Grandchild2'} 
    ]; 

    // I have a ton of menu items though, so the method I'm using 
    // below is very inefficient: 
    if(win.subID == '1'){ 
     tableview.setData(data1); 
    } else if(win.subID == '2'){ 
     tableview.setData(data2); 
    } 

Il y a beaucoup d'autres menus (1,2,3,4, etc et 1_1,1_2,1_3,2_1,2_2, etc.), la méthode ci-dessus de régler les données est extrêmement inefficace. Ce que je voudrais donc quelque chose comme ceci:

tableview.setData(data + win.subID); 

Cependant, je sais que les données sont un objet de tableau et subid est une chaîne. Comment puis-je combiner le nom d'un objet avec une chaîne, puis le convertir pour se référer à un objet à nouveau?

Merci, et s'il vous plaît laissez-moi savoir si quelque chose ci-dessus n'était pas clair. J'ai lutté avec ça pendant très longtemps.

EDIT:

Voici ce que j'ai besoin en d'autres termes de:

J'ai une chaîne, que je veux utiliser pour référencer un tableau. Ce dont j'ai besoin est cette chaîne magique à la fonction tableau/objet.

+0

ce n'est pas clair ... –

+0

Comment puis-je le rendre plus clair? – Connor

Répondre

0

Je pense que ce que vous voulez est un tableau de tableaux afin que vous puissiez le faire ...

tableView.setData(data[win.subID]); 
+0

Cela fonctionnerait si chaque ensemble de données faisait partie d'un tableau plus grand. Cependant, chaque tableau est complètement un tableau séparé, appelé data1, data2, data1_1, etc. J'ai une chaîne avec le numéro du tableau que j'ai besoin d'afficher, mais je ne sais pas comment utiliser cette chaîne pour cibler ce tableau . – Connor

+0

@Connor c'est pourquoi j'ai dit que la question est confuse ... –

+0

J'ai édité mon message original avec un autre exemple. J'espère que cela clarifie le problème. – Connor

0

Il y a probablement une façon plus élégante de le faire, mais je suis fatigué:] Mais vous pouvez utiliser des tables de hachage comme une solution

Javascript hash tables

var myArray = new Array(); 
myArray['data1_1'] = data1_1; 
myArray['data1'] = data1; 
myArray['data'] = data; 

var thestring='data1'; 
tableview.setData(myArray[thestring]); 

Quelque chose comme ça peut faire l'affaire.

1

Je ne connais pas suffisamment le titane pour répondre directement à cette question, mais voici un indice. Quel est l'objet global en titane? Vous savez, si vous déclarez une variable globale, à quel objet appartient cette variable?

Dans un environnement de navigateur, l'objet global est une fenêtre. L'utilisation d'une variable globale ou l'appel d'une fonction globale permet d'accéder aux propriétés et aux méthodes d'appel de l'objet window. Ainsi, dans un navigateur Web:

setTimeout(foo, 10) 
// is the same as: 
window.setTimeout(foo, 10) 
// is the same as: 
window['setTimeout'](foo,10) 

et

x = 5 
// is the same as: 
window.x = 5 
// is the same as: 
window['x'] = 5 

Donc, dans votre cas, si cela était un navigateur Web standard, votre code serait:

var string = 'data1'; 
tableview.setData(window[string]); 

Pas tous javascript Les implémentations fonctionnent de cette façon, cela fonctionne sur tous les navigateurs Web connus avec le support de JavaScript. Je ne sais pas si vous pouvez le faire en titane.