Порядок инициализации класса MXML - PullRequest
0 голосов
/ 04 августа 2011

Я написал несколько пользовательских компонентов во Flex 4 и несколько раз сталкивался с этой проблемой.

var myForm:MyForm = new MyForm;
myForm.SetData(data);
addElement(myForm);

Теперь представьте, что я вызываю эти функции из неконструктивной функции Panel или VGroup (или любого другого контейнера). Досадно, что во время MyForm.SetData () не все объявленные там поля myForm еще инициализированы. Такие как:

<s:VGroup id="dataGroup">

Если моя функция SetData () хочет получить доступ к dataGroup (по причине того, что .addElement () только что полученные данные к ней), она просто завершается с ошибкой nullpointer, поскольку dataGroup еще не создана, несмотря на то, что после конструктор Как можно гарантировать, что форма была полностью инициализирована?

Ответы [ 2 ]

3 голосов
/ 04 августа 2011

Прослушивание события creationComplete и добавление компонентов в обработчик этого события - один из способов сделать это. Это то, что предложил Сэм ДеХаан.

Другой способ сделать это - переопределить функцию createChildren(). Это функция, которая создает и добавляет все дочерние компоненты компонента. Код будет выглядеть примерно так:

override public function createChildren():void
{
    super.createChildren();

    var myForm:MyForm = new MyForm;
    // Note that data may be null here, best to 
    // override commitProperties() to set it.
    myForm.SetData(data);   
    addElement(myForm);
}

Документы по жизненному циклу компонента предоставят массу деталей по этой теме.

1 голос
/ 04 августа 2011

Если я не неправильно понял ваш вопрос,

Вы должны поместить код, который встречается в этом исключении нулевого указателя, в обратный вызов creationComplete в контейнере, который вам нужно определить.

...