Как проанализировать компонент Flex перед добавлением его на экран - PullRequest
2 голосов
/ 25 августа 2009

Предположим, у вас есть файл MyView.mxml, который в основном представляет собой Panel с несколько детей (Form, FormItems, Buttons ...).

Можно ли перебирать MyView и получать всю информацию о его дочерние элементы (типы, id ...) перед его отображением.

В моем Main.mxml, если у меня есть эта функция

    public function iterateOverChildren(comp:Container):void {
        // Get the number of descriptors.
        trace("Running iterateOverChildren for " + comp.id);
        if (comp != null)
        {
        var n:int = comp.childDescriptors.length;
        for (var i:int = 0; i < n; i++) {
            var c:ComponentDescriptor = comp.childDescriptors[i];
            var d:Object = c.properties;

            // Log ids and types of objects in the Array.
            trace(c.id + " is of type " + c.type);

            // Log the properties added in the MXML tag of the object.
            for (var p:String in d) {
                trace("Property: " + p + " : " + d[p]);
            }
        }
        }
    }

Почему этот звонок не работает?

var myV = MyView (); iterateOverChildren (MYV);

Это работает, только если я добавлю заявление вроде AddChild (MYV); перед вызовом iterateOverChildren. (Но это не то, что я хочу, я хочу повторять описания, не добавляя их для отображения).

Когда я читаю это http://livedocs.adobe.com/flex/3/html/help.html?content=layoutperformance_06.html

Я думал, что метод childDescriptors не зависит от жизненного цикла, он позволил бы мне проанализировать компонент, не добавляя его к отображению. Что я упустил ? Как выполнить анализ компонента перед его отображением.

1 Ответ

2 голосов
/ 25 августа 2009

Существует несколько способов создания компонентов в Flex.

Если вы используете конструктор в ActionScript, вы получите голый металлический объект, в котором ничего, кроме конструирования самого объекта, не было завершено. В частности, этот новый объект еще не создал свои дочерние представления, поэтому вы ничего не видите, когда смотрите на результаты getChildren().

Если вы записываете свой компонент в MXML, компилятор MXML создает «ComponentDescriptors» вместо «реальных» объектов. Они содержат всю информацию, указанную вами для объекта в MXML (свойства, привязки, обработчики событий и т. Д.), И среда выполнения использует их для создания реальных объектов в соответствующее время. «Соответствующее время» обычно означает «когда объект добавлен в список отображения». Вот почему вы видите детей только после вызова addChild() (технически, не сразу после вызова addChild (), а только после того, как ваш недавно созданный объект отправил свое событие creationComplete).

...