2009-06-24 15 views
15

Czy ktoś może mi powiedzieć, w jaki sposób mogę zidentyfikować typ obiektu w flex? W szczególności mam tablicę, w której przechowuje się wiele typów (ale wszystkie UIComponents) teraz, gdy oceniam tablicę Chcę dowiedzieć się, czy mam kontrolę TextInput lub RadioButton. Czy ktoś ma pomysł?Uzyskaj typ w flex

góry dzięki

+0

prostu zrobił to z "is": var b: Boolean = arr [i] to TextInput, czy jest to jedyny i najlepszy sposób na zrobienie tego? –

+0

ObjectUtil.getClassInfo ( – cloverink

Odpowiedz

18

Można Test przeciwko danej klasy przy użyciu „jest” operator lub użyć flash.utils.getQualifiedClassName() (przekazać mu swój przedmiot) - który zwróci ciąg w pełni kwalifikowana nazwa klasy.

+0

Ah yes - getQualifiedClassName() Przydaje się więcej niż kilka razy –

1

Testy operatora dla zgodności typów, tak. Od docs, is:

... ocenia, czy dany przedmiot jest kompatybilny z określonym typem danych, klasy lub interfejsu. Użyj operatora is zamiast operatora porównania porównań typów. Możesz użyć również operatora is, aby sprawdzić , czy obiekt implementuje interfejs .

Inne przydatne operatorom w tej kategorii są typeof (która zwraca ciąg znaków reprezentujący prymitywne), instanceof (podobny do is, ale pomija kompatybilności interfejsu) i as. Świetna i kompletna lista operatorów ActionScript is available here.

Mam nadzieję, że pomoże!

3

Operator "jest" reprezentuje jedną opcję.

Następnie jest operator instanceof, który może, ale nie musi być przydatny w zależności od sytuacji.

Istnieje również klasa ObjectUtil z metodą statyczną getClassInfo. Ten zwraca więcej niż tylko nazwę klasy obiektu.

Operator "typof" jest niestety nieprzydatny dla klas.

I, jak już sugerował Branden Hall, flash.utils.getQualifiedClassName().

2

oto kilka prostych pseudo-kod, który pokazuje, jak używać operatora is za to, co chcesz zrobić:

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

Możesz użyć Object zamiast *, chyba że oczekujesz przestrzeni nazw i innych zwariowanych elementów w twojej tablicy –

+0

Dobra rada, ja próbowałem uczynić to tak elastycznym, jak to tylko możliwe, w rzeczywistości, jeśli wiesz, że masz tylko UIComponents lub DisplayObjects, możesz to wykorzystać. –

0

Najprościej jest użycie „jest” operatorem i użyć czegoś takiego:

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 
} 

Jest jednak jeden problem z tym podejściem. Ponieważ "jest", zwróci wartość true dla wszystkich klas potomnych, musisz umieścić wszystkie klasy potomków przed ich przodkami - lista musi nadejść przed ListBase. Może to powodować pewne niedogodności.

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

Jest jeszcze jedna opcja dla przypadków, w których chcesz obiekty być członkiem określonej klasy (a nie potomkiem klasy): można użyć właściwości konstruktora obiektu i użyć instrukcji 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

Spróbuj użyć właściwości "className".

Warto wrócić "TextInput" lub przycisk "" w zależności od przypadku

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

jego pracy :)

Poniżej znajduje się sposób w jaki rozwiązano ten problem

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; 
    }