我在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>
感谢
答案 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”,则在创建时,它将创建其所有子组件。否则,它会延迟到最后一分钟。它使创建速度变慢,但是如果你需要它可以立即编码,那么你就可以这样做而不必破解它。这解决了我的问题,希望它有所帮助。