Apache flex IOErrorEvent…我做错了什么?

Apache flex IOErrorEvent…我做错了什么?,apache-flex,actionscript-3,Apache Flex,Actionscript 3,我有一个带有自定义项渲染器的datagrid,如下所示: <mx:AdvancedDataGridColumn dataField="file"> <mx:itemRenderer> <fx:Component> <mx:HBox paddingLeft="2"> <fx:Script> <![CDATA[ import mx.core.BitmapAsset; [Embed(source="components/downloa

我有一个带有自定义项渲染器的datagrid,如下所示:

<mx:AdvancedDataGridColumn dataField="file">
<mx:itemRenderer>
<fx:Component>
<mx:HBox paddingLeft="2">
<fx:Script>
<![CDATA[

import mx.core.BitmapAsset;
[Embed(source="components/download.png")]
[Bindable]
public var imgCls:Class;

public function IOErrorEventExample():void {
var loader:URLLoader = new URLLoader();
loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
var request:URLRequest=new URLRequest("http://www.site.com/"+data.file);
loader.load(request);
}

private function ioErrorHandler(event:IOErrorEvent):void {
if ( String(event) != null ){
// load the itemrenderer image here if the file exists on our server
var imgObj:BitmapAsset = new imgCls() as BitmapAsset;
myImage.source=imgObj;

}
else {
// don't load the itemrenderer image if the file doesn't exist yet
}}                                      
]]>
</fx:Script>
<mx:Image id="myImage" creationComplete="IOErrorEventExample();"/>
</mx:HBox>
</fx:Component>
</mx:itemRenderer>
</mx:AdvancedDataGridColumn>


因此,如果我的服务器上有实际的文件,我想显示download.png图像…但是,当我编译并运行上面的代码时,.png图像随机出现..不管“文件”是否存在。我做错了什么?

在关闭CDATA标记之前,需要通过添加最后一个大括号来关闭ioErrorHandler函数

不能肯定这会解决问题,但是逻辑看起来是正确的。您可以尝试添加Event.COMPLETE事件侦听器,以确保文件确实存在并且正在加载

编辑:
您可以将此事件处理程序函数缩短为以下形式:
1。此函数仅在分派IOErrorEvent时调用,因此在调用时始终存在一个事件对象。(不需要if语句)
2。即使将if语句保留在中,也不需要调用else语句,因为如果文件确实存在,则不会调用此函数

private function ioErrorHandler(event:IOErrorEvent):void 
{
    var imgObj:BitmapAsset = new imgCls() as BitmapAsset;
    myImage.source=imgObj;
}

您设置的IOErrorEvent就是这样做的,但是在您的情况下,它没有按您想要的方式工作。因此,要进行调试,需要缩小可能破坏脚本的区域。首先要做的是检查您是否真的正在加载文件(Event.Complete会为您确认),因为如果您认为是但不是,那么这只是一个用户错误,而不是代码错误。这取决于您是否正在侦听UIComponent上的creationComplete,但正在将数据加载到该UIComponent,然后,creationComplete事件将在创建组件时触发,而不是在加载数据时触发。当数据加载到您的数据obj/var中时,您需要另一个事件侦听器来侦听。如果在创建组件之前数据已存在,即已删除,则data.File不应为null。