2009-06-24 12 views
15

qualcuno può dirmi come posso identificare il tipo di un oggetto in flex? In particolare, ho un array in cui memorizzo più tipi in (ma tutti gli UIComponents) ora mentre valuto l'array che voglio scoprire se ho un controllo TextInput o un RadioButton. Qualcuno ha un'idea?Ottieni il tipo in flex

Grazie in anticipo

+0

appena fatto con "è": var b: Boolean = arr [i] è TextInput, è questo l'unico e il modo migliore per farlo? –

+0

ObjectUtil.getClassInfo ( – cloverink

risposta

18

è possibile prova contro una particolare classe utilizzando la "è" operatore oppure è possibile utilizzare flash.utils.getQualifiedClassName() (lo si passa l'oggetto) - che restituirà una serie di il nome completo della classe.

+0

Ah sì - getQualifiedClassName() .È utile in più di un paio di volte. –

1

I test operatore is per compatibilità di tipo, sì. Dalla documentazione, is:

... valuta se un oggetto è compatibile con uno specifico tipo di dati, classe o interfaccia. Utilizzare l'operatore anziché l'operatore per il confronto dei tipi. È possibile anche utilizzare l'operatore is per verificare se un oggetto implementa un'interfaccia .

Altri operatori utili in questa categoria sono typeof (che restituisce una rappresentazione di stringa di un primitivo), instanceof (simile a is, ma trascura compatibilità interfaccia) e as. Un elenco completo e completo di operatori ActionScript is available here.

Spero che aiuti!

3

L'operatore "è" rappresenta un'opzione.

Poi c'è l'operatore instanceof, che potrebbe o non potrebbe essere utile a seconda della situazione.

Inoltre c'è la classe ObjectUtil con metodo statico getClassInfo. Questo restituisce più del nome della classe dell'oggetto.

L'operatore "typeof" purtroppo è inutile per le classi.

E, come già suggerito da Branden Hall, flash.utils.getQualifiedClassName().

2

ecco alcune semplici pseudo-codice che dimostra come utilizzare l'operatore is per quello che si vuole fare:

for each (var item:* in myArray) 
{ 
    if (item is TextInput) 
     doSomethingWithTextInput(item as TextInput); 
    else if (item is RadioButton) 
     doSomethingWithRadioButton(item as RadioButton); 
} 
+0

È possibile utilizzare Oggetto anziché * a meno che non si aspettino spazi dei nomi e altri elementi pazzi nell'array. –

+0

Buon punto, I Stavo solo cercando di renderlo il più flessibile possibile. Infatti, se sai che avrai solo UIComponents o DisplayObjects, potresti usarlo. –

0

La cosa migliore è usare l'operatore "è" e usare qualcosa come:

for(var i:int = 0; i < componentArr.length; i++) 
{ 
    var comp:UIComponent = componentArr[ i ]; 
    if(comp is DataGrid) 
     // Handle DataGrid functionality here. 
    else if (comp is DropDown) 
     // Handle DropDown here 
} 

C'è un problema con questo approccio, tuttavia. Poiché "is" restituisce true per tutte le classi discendenti, devi mettere tutte le classi discendenti prima dei loro antenati - L'elenco deve venire prima di ListBase. Ciò può causare alcuni fastidi.

// This is important to remember: 
var mc:MovieClip = new MovieClip(); 
trace(mc is Sprite); // true 

C'è un'altra possibilità per i casi in cui si desidera gli oggetti di essere un membro di una classe specifica (e non una classe discendente): è possibile utilizzare la proprietà constructor dell'oggetto e utilizzare un'istruzione switch.

for(var i:int = 0; i < componentArr.length; i++) 
{ 
    var klass:Class = componentArr[ i ].constructor; 

    switch(klass) 
    { 
     case DataGrid: 
      // Handle DataGrid 
      break; 
     case Text: 
      // Handle Text 
      break; 
     case NumericStepper: 
      // Handle NumericStepper 
      break; 
     default: 
      // Handle default 
      break; 

    } 
} 
3

Provare a utilizzare la proprietà "className".

Esso dovrebbe restituire "TextInput" o "" a seconda del caso

for each (var item:* in myArray) 
{ 
    if(item.hasProperty('className')) 
    { 
     trace("item ["+i+"] is :" + item['className']); 
    } 
} 
4

suo funzionamento :)

seguito è il modo in cui ho risolto questo problema

switch(true) 
    { 
    case item is Customer_SF: 
    c = item as Customer_SF; 
    break; 

    case item is Opportunity: 
    o = item as Opportunity; 
    break; 

    case item is Product: 
    o = (item as Product)._opportunity; 
    break; 
    default: 
    return true; 
    } 
Problemi correlati