Получить тип в flex - PullRequest
15 голосов
/ 24 июня 2009

Может кто-нибудь сказать мне, как я могу определить тип объекта в flex? В частности, у меня есть массив, в котором я храню несколько типов (но все UIComponents) сейчас, когда я оцениваю массив, я хочу выяснить, есть ли у меня элемент управления TextInput или RadioButton. У кого-нибудь есть идея?

Заранее спасибо

Ответы [ 7 ]

18 голосов
/ 24 июня 2009

Вы можете либо протестировать определенный класс, используя оператор "is", либо использовать flash.utils.getQualifiedClassName () (вы передаете ему свой объект) - который вернет строку полного имени класса.

4 голосов
/ 22 августа 2010

ЕГО РАБОТАЕТ:)

Вот как я решил эту проблему

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;
   }
3 голосов
/ 26 июня 2009

Попробуйте использовать свойство "className".

Должен возвращать «TextInput» или «Button» в зависимости от случая

for each (var item:* in myArray)
{
    if(item.hasProperty('className'))
    {
        trace("item ["+i+"] is :" + item['className']);
    }
}
3 голосов
/ 24 июня 2009

Оператор "is" представляет один вариант.

Затем есть оператор instanceof , который может или не может быть полезен в зависимости от ситуации.

Также есть класс ObjectUtil со статическим методом getClassInfo .Этот возвращает больше, чем просто имя класса объекта.

Оператор "typeof", к сожалению, бесполезен для классов.

И, как уже предложил Бранден Холл, flash.utils.getQualifiedClassName () .

2 голосов
/ 24 июня 2009

Вот простой псевдокод, демонстрирующий, как использовать оператор is для того, что вы хотите сделать:

for each (var item:* in myArray)
{
    if (item is TextInput)
        doSomethingWithTextInput(item as TextInput);
    else if (item is RadioButton)
        doSomethingWithRadioButton(item as RadioButton);
}
1 голос
/ 24 июня 2009

Оператор is проверяет совместимость типов, да. Из документов is:

... оценивает, является ли объект совместим с конкретным типом данных, класс или интерфейс. Используйте is оператор вместо instanceof оператор для сравнения типов. Вы можете также используйте оператор is для проверки реализует ли объект интерфейс.

Другими полезными операторами в этой категории являются typeof (который возвращает строковое представление примитива), instanceof (аналогично is, но без учета совместимости интерфейса) и as. Большой и полный список операторов ActionScript доступен здесь .

Надеюсь, это поможет!

0 голосов
/ 24 июня 2009

Ваша лучшая ставка - использовать оператор "is" и использовать что-то вроде:

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
}

Однако у этого подхода есть одна проблема. Поскольку is будет возвращать true для всех классов-потомков, вы должны поместить все классы-потомки перед их предками - List должен предшествовать ListBase. Это может вызвать некоторые неудобства.

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

Существует еще одна опция для случаев, когда вы хотите, чтобы объекты были членами определенного класса (а не класса-потомка): вы можете использовать свойство constructor объекта и использовать оператор 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;

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...