FLEX:当我调用它的方法时,自定义组件仍然是一个 Null 对象
Posted
技术标签:
【中文标题】FLEX:当我调用它的方法时,自定义组件仍然是一个 Null 对象【英文标题】:FLEX: the custom component is still a Null Object when I invoke its method 【发布时间】:2011-02-09 10:27:48 【问题描述】:我在 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" >
<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>
谢谢
【问题讨论】:
【参考方案1】:我自己也遇到了这个问题,发现问题的另一个方面,creationPolicy 属性:
http://livedocs.adobe.com/flex/3/html/help.html?content=layoutperformance_05.html
如果您在自定义组件中设置 creationPolicy="all",则在创建时,它将创建其所有子组件。否则,它会延迟到最后一分钟。它使创建速度变慢,但如果您需要立即将其全部用于编码,这允许您这样做,而无需绕过它。这为我解决了问题,希望对您有所帮助。
【讨论】:
【参考方案2】:您收到错误消息是因为在您调用 setName 函数时,ID 为“用户名”的标签组件尚未初始化。
您可以在 UserComp 中创建一个属性,并将 Label 的 text 属性绑定到它。在您的 setName 函数中,您将值分配给刚刚创建的属性。当 Label 组件创建时,它将使用属性中的值显示在屏幕上。
<?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" >
<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>
【讨论】:
【参考方案3】:你可以试试creationcompleted方法。类似于以下内容:
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="creationCompletedHandler(event)">
并在脚本中添加以下内容:
import mx.events.FlexEvent;
private function creationCompletedHandler(event:FlexEvent):void
//Your code
【讨论】:
我实际上需要从主应用程序调用 setName 函数,而不是从组件调用。我复制的第一部分代码来自主应用程序,我从那里调用方法。以上是关于FLEX:当我调用它的方法时,自定义组件仍然是一个 Null 对象的主要内容,如果未能解决你的问题,请参考以下文章