Flex Instantiated Object — дождитесь создания CreationComplete

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

newMessage = new MessageDetail();
newMessage.body.text = "Hello World";

Я получаю сообщение об ошибке "Не удается получить доступ к свойству или методу ссылки на нулевой объект" во второй строке, поскольку newMessage не был полностью создан до нажатия второй строки кода, пытающегося установить текстовое поле моего "тела" текст. Я знаю, что могу создать обработчик события "creationComplete", но нет ли более простого способа сделать это?


person Chris Klepeis    schedule 12.11.2009    source источник


Ответы (2)


Не обращайтесь к подкомпонентам вообще.

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

Например:

МойКомпонент.MXML:

<mxml blah blah blah>

<script>
  [Bindable] public var bodyText;
</scipt>


<mx:TextArea text="{bodyText}" />
</mxml>

В вашем коде:

myComponent = new MyComponent()
myComponent.bodyText = "Hello World!";

В общем, я считаю, что общедоступность подкомпонентов по умолчанию была огромной ошибкой во Flex.

person Marc Hughes    schedule 12.11.2009

Я могу порекомендовать создать все дочерние элементы в вашем компоненте, переопределив метод createChildren(). Это обеспечит создание экземпляров всех детей. Подробнее здесь и здесь

    public class MessageDetail() 
    {

        // ...
        private var body:TextArea;
        // ...

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

            body = new TextArea();
            addChild(body);
        }

РЕДАКТИРОВАТЬ:

newMessage = new MessageDetail();
addChild(newMessage); // During this step all children will to be initialized
newMessage.body.text = "Hello World";

Спасибо Майклу Брюер-Дэвису за комментарий

person tefozi    schedule 12.11.2009
comment
Это верно, но не относится к делу — здесь отлично подходит метод createChildren(). Но он не вызывается до инициализации(), т. е. когда объект добавляется в список отображения. - person Michael Brewer-Davis; 12.11.2009
comment
Таким образом, используя этот метод, я никак не могу использовать представление дизайна, чтобы увидеть, как оно будет выглядеть? Мой компонент MessageDetail имеет около 8 дочерних компонентов. Было бы неплохо, если бы была функция ожидания для ожидания загрузки указанного объекта. - person Chris Klepeis; 13.11.2009
comment
Я хотел сказать, что код в вашем редактировании с использованием addChild() работал бы даже без специального метода createChildren(). - person Michael Brewer-Davis; 13.11.2009