2010-11-12 161 views
0

我有一个DataGrid瓦特/自定义项目渲染,如下:IOErrorEvent ....我做错了什么?

<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图像随机出现,无论“文件”是否存在。我究竟做错了什么?

回答

1

您需要通过添加一个最后的大括号您关闭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; 
} 
+0

您设置的IOErrorEvent是实现它的方法,但在您的情况下,它不能按照您的方式工作。因此,要进行调试,您需要缩小可能会破坏脚本的区域。首先要做的是检查你是否真的加载了一个文件(哪个Event.Complete会为你确认),因为如果你认为你是,但你不是,那么这只是一个用户错误而不是代码错误。 – Aesphere 2010-11-12 12:59:20

+0

这取决于,如果您在UIComponent上侦听creationComplete,但是您正在将数据加载到该UIComponent,那么creationComplete事件将在组件创建时触发,而不是在数据加载完成时触发。您将需要另一个事件侦听器来侦听何时将数据加载到数据obj/var中。如果数据存在,即在创建组件之前嵌入数据,那么data.File不应该为空。 – Aesphere 2010-11-14 09:37:33