FLEX:当我调用其方法时,自定义组件仍然是一个Null对象

时间:2010-04-18 18:07:58

标签: flex

我在Flex中创建了一个自定义组件,我使用actionscript从主应用程序创建了它。接着我调用它的“setName”方法来传递一个String。

我收到以下运行时错误(仅当我使用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 个答案:

答案 0 :(得分:3)

您收到错误消息,因为调用setName函数时,尚未初始化ID为“username”的Label组件。

您可以在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 :(得分:1)

您可以尝试使用creationcompleted方法。类似于以下内容:

<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
}

答案 2 :(得分:0)

我自己也遇到了这个问题,并找到了问题的另一个方面,即creationPolicy属性:

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

如果在自定义组件中设置creationPolicy =“all”,则在创建时,它将创建其所有子组件。否则,它会延迟到最后一分钟。它使创建速度变慢,但是如果你需要它可以立即编码,那么你就可以这样做而不必破解它。这解决了我的问题,希望它有所帮助。