Flex - объекты внутри объектов - PullRequest
0 голосов
/ 12 марта 2012

Так что я все еще пытаюсь разобраться с Flex и ООП, и я застрял прямо сейчас.Вот код, с которым я сейчас работаю.

    var labs:ArrayCollection = new ArrayCollection();
    var sets:ArrayCollection = new ArrayCollection();

    var labsArray:Array = ["ProDPI","WHCC","Tin"];
    var setsArray:Array = [ ["Set01","Set02","Set03","Set04"],["Set11","Set12","Set13","Set14"], ["Set21","Set22","Set23","Set24"] ];

    var objLab:Object = new Object;
    objLab.labName = labsArray[0];
    objLab.setFolders = undefined;
    labs.addItem(objLab);

    for (var i:int = 0; i < setsArray.length; i++) {
        var objSets:Object = new Object;
        objSets.setName = setsArray[i];
        sets.addItem(objSets);
        objLab.setFolders = objSets;
    }
    labFolderList.labelField="labName";
    labFolderList.dataProvider=labs;

    setFolderList.labelField="setFolders";
    setFolderList.dataProvider=sets;

Объект objLab возвращается так, как я хочу.Объект objSets отображается в моем ComboBox как объект Object.Приложение ComboBox # 1 будет заполнено labsArray, который работает.В зависимости от выбора [0,1,2] из массива это вызовет из массива наборов массив в соответствующей позиции.

Наконец, при выборе ComboBox # 1, второй ComboBox #2 изменится на соответствующий выбор.

Любая помощь в том, как правильно настроить отображение объектов, будет очень полезна.Кроме того, если мое исполнение не лучший способ сделать это в любом направлении (ссылки / документация), я также приму.Заранее спасибо.

1 Ответ

0 голосов
/ 12 марта 2012

Я отредактировал ваш исходный код на основе предположений о том, что вы пытались выполнить, я добавил объекты Array непосредственно в коллекцию, которой назначен поставщик данных, в этом случае вы должны увидеть выходные данные метода .toString (), вызванного для массив вместо класса Object, класс Object .toString () выведет [объект Object], который вы видели на дисплее. Метод Array .toString () будет вызывать .toString () для каждого элемента в массиве, отделять их запятыми и окружать их фигурными скобками, что очень похоже на то, что вы используете при определении массива. В качестве альтернативы вы можете создать свой собственный класс, который расширяет Object, и создать свой собственный метод toString для переопределения поведения по умолчанию. Использование Object, как правило, не очень хорошая практика (есть исключения из этого, это не жесткое правило, но, как правило, лучше использовать конкретный тип класса или даже лучше интерфейс, когда это возможно).

    var labs:ArrayCollection = new ArrayCollection();
    var sets:ArrayCollection = new ArrayCollection();

    var labsArray:Array = ["ProDPI","WHCC","Tin"];
    var setsArray:Array = [ ["Set01","Set02","Set03","Set04"],["Set11","Set12","Set13","Set14"], ["Set21","Set22","Set23","Set24"] ];

    var objLab:Object = new Object;
    objLab.labName = labsArray[0];
    objLab.setFolders = undefined;
    labs.addItem(objLab);

    for (var i:int = 0; i < setsArray.length; i++) {
        sets.addItem(setsArray[i]);
        objLab.setFolders = setsArray[i];
    }
    labFolderList.labelField="labName";
    labFolderList.dataProvider=labs;

    setFolderList.labelField="setFolders";
    setFolderList.dataProvider=sets;

Другой альтернативой созданию класса, как я объяснил выше, является использование labelFunction вместо labelField с использованием labelFunction каждого элемента: объект в dataProvider будет передан в вашу пользовательскую labelFunction, и вы можете вернуть строку на основе любого Логика вы считаете нужным. Было бы что-то вроде этого:

   setFolderList.labelFunction = myLabelFunction;

   private function myLabelFunction(item:Object):String
   {
       var retString:String = "";
       for(var i:int=0; i<item.setName.length; i++)
       {
            if(i>0)
                retString += ", ";
            retString += item.setName[i];
       }
       return retString;
   }
...