FLEX: пользовательский компонент все еще является нулевым объектом, когда я вызываю его метод - PullRequest
0 голосов
/ 18 апреля 2010

Я создал пользовательский компонент во Flex и создал его из основного приложения с помощью ActionScript. Последовательно я вызываю его метод "setName" для передачи строки.

Я получаю следующую ошибку времени выполнения (возникающую, только если я использую метод setName):

TypeError: Error #1009: Cannot access a property or method of a null object reference.

Полагаю, я понял, потому что я вызываю метод newUser.setName из основного приложения до полного создания компонента.

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

Вот код:

Главное приложение

...
newUser = new userComp();
//newUser.setName("name");

Компонент:

<?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" width="100" height="200" >

<mx:Script>
    <![CDATA[


        public function setName(name:String):void {
            username.text = name;
        }

       public function setTags(Tags:String):void {

        }

    ]]>
    </mx:Script>

    <mx:HBox id="tagsPopup" visible="false">
        <mx:LinkButton label="Tag1" />
        <mx:LinkButton label="Tag2" />
        <mx:LinkButton label="Tag3" />      
    </mx:HBox>

    <mx:Image source="@Embed(source='../icons/userIcon.png')"/>
    <mx:Label id="username" text="Nickname" visible="false"/>

</mx:VBox>

спасибо

Ответы [ 3 ]

3 голосов
/ 19 апреля 2010

Вы получаете сообщение об ошибке, потому что компонент Label с идентификатором «username» не был инициализирован при вызове функции setName.

Вы можете создать свойство в UserComp и установить привязанное к нему свойство текста Label. И в вашей функции setName вы присваиваете значение только что созданному свойству. Когда компонент Label создан, он будет использовать значение из свойства для отображения на экране.

<?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" width="100" height="200" >

<mx:Script>
    <![CDATA[
        [Bindable]
        private var _name;
        public function setName(name:String):void {
            _name=name;
        }

       public function setTags(Tags:String):void {

        }

    ]]>
    </mx:Script>

    <mx:HBox id="tagsPopup" visible="false">
        <mx:LinkButton label="Tag1" />
        <mx:LinkButton label="Tag2" />
        <mx:LinkButton label="Tag3" />      
    </mx:HBox>

    <mx:Image source="@Embed(source='../icons/userIcon.png')"/>
    <mx:Label id="username" text="{_name}" visible="false"/>

</mx:VBox>
1 голос
/ 19 апреля 2010

Вы можете попробовать создание завершенного метода. Похоже на следующее:

<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" width="100" height="200" creationComplete="creationCompletedHandler(event)">

и добавить в сценарий следующее:

import mx.events.FlexEvent;

private function creationCompletedHandler(event:FlexEvent):void
{
   //Your code
}
0 голосов
/ 28 июня 2010

Я сам столкнулся с этим и обнаружил еще один аспект проблемы - атрибут creationPolicy:

http://livedocs.adobe.com/flex/3/html/help.html?content=layoutperformance_05.html

Если вы установите creationPolicy = "all" в пользовательском компоненте, то при создании он создаст все свои подкомпоненты. В противном случае он задерживается до последней минуты. Это замедляет процесс создания, но если вам нужно, чтобы все это было доступно для немедленного написания кода, это позволяет делать это без необходимости обходить его. Это решило проблему для меня, надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...