Arhn - архитектура программирования

Как проанализировать компонент Flex перед его добавлением для отображения

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

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

В моем 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» не зависит от жизненного цикла, он позволит мне изучить компонент, не добавляя его для отображения. Что я пропустил ? Как мне изучить компонент перед отображением.

24.08.2009

  • Почему именно вы пытаетесь перебрать всех дочерних элементов MyView? В зависимости от того, какую информацию вы ищете, есть несколько способов сделать это. 25.08.2009
  • У меня есть эти метаданные для каждого элемента (потомков) в серверной части для каждой роли пользователя. Раньше я приносил все метаданные, но теперь приложение стало больше, и я хочу вывести из серверной части только связанные метаданные. Я хочу написать что-то динамическое, чтобы найти все эти идентификаторы (это мой ключ для метаданных) из MyView, прежде чем я создам экземпляр. Я знаю, что результаты getChildren зависят от CreationPolicy, поэтому, когда я прочитал о childDescriptors, это выглядело как то, что я искал. 25.08.2009

Ответы:


1

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

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

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

24.08.2009
  • Спасибо, Саймон. Думаю, я все еще не понимаю на 100%, как использовать childDescriptors вместо getChildren (). Все контейнеры имеют свойство childDescriptors. В зависимости от значения свойства createPolicy Flex немедленно начинает создавать экземпляры элементов управления внутри контейнеров или откладывает их создание. Если создание экземпляра отложено, вы можете использовать свойства этого массива для доступа к ComponentDescriptor каждого компонента и создания этого объекта в указанное время. Является ли ваша интерпретация вышесказанного, что дескрипторы не доступны сразу. 25.08.2009
  • Дескрипторы доступны сразу же, но только для объектов, созданных в коде MXML. Если вы создаете экземпляр объекта в ActionScript, вызывая конструктор, как в var myV = MyView();, вы получаете реальный объект, не имеющий дочерних дескрипторов. 25.08.2009
  • Понял, спасибо. Если я сделаю это var myV = MyView (); myV.initialize (); iterateOverChildren (myV); Я получу информацию. Как я могу сделать это рекурсивным? В моем коде iterateIVerChildren var c является ComponentDescriptor. Могу ли я найти детей c? 25.08.2009
  • UIComponent.initialize () уже работает рекурсивно. После его вызова вы сможете получить доступ к дочерним элементам myV через getChildren (). 25.08.2009
  • Кроме того, чтение исходного кода Flex помогло мне в прошлом, когда документация была неясной. Это довольно удобно для чтения. 25.08.2009
  • К сожалению, я вернулся на круги своя. Запуск initialize () явно вызывал ошибки выполнения на некоторых из моих компонентов. Я признателен, если кто-то сможет попытаться написать код для функции displayAllTheIdsRecursively () ниже. (Я не ленив, просто застрял). var myV: MyView = новый MyView (); // Функция ниже будет отображать id всех UIComponents (рекурсивных) из MyView displayAllTheIdsRecursively (myV); 25.08.2009
  • Вероятно, вам нужно будет дождаться завершения инициализации. Итак, установите обработчик событий для инициализированного события (я думаю, что это правильный вариант), тогда вы сможете получить доступ к childDescriptors. 27.08.2009
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..