我是一名经验丰富的AS开发人员,但这是关于flex的一些非常基本的东西,我无法弄清楚。在下面的类中,我不确定为什么在图像加载url时不会执行函数 imageLoaded 。这里有竞争条件吗?在创建此对象并调用 setPicture 时,应用程序将完全加载。 在这种情况下,如何正确触发Event.COMPLETE事件?
行和 Log.info 函数对我来说很方便,它们肯定有效。
这是我的MXML定义:
<?xml version="1.0" encoding="utf-8"?>
<photo:PhotoClass xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:photo="com.xxx.widgets.photo.*">
<mx:Image id="image"/>
</photo:PhotoClass>
这是我的动作:
public class PhotoClass extends Box {
public var image : Image;
public function PhotoClass() {
image = new Image();
image.addEventListener(Event.COMPLETE, imageLoaded);
}
private function line(txt : *) : void {
Log.info(txt, "PhotoClass");
}
public function setPicture(url : String) : void {
line("setPicture: " + url);
image.source = url;
}
public function imageLoaded(event : Event) : void {
line("image loaded");
}
}
答案 0 :(得分:3)
除非精灵附加到应用程序,否则eventListeners不会注册。
你能提供参考吗?因为我相信这个问题是另一回事。
当您声明一个以PhotoClass
为根标记的mxml文件时,您正在扩展PhotoClass。 mxml中的<mx:Image> tag
在mxml类中定义了Image类型的公共变量;并且你已经在超类中拥有public var image:Image;
。这将产生冲突 - 我期望编译时错误。
我的猜测是,由于首先调用构造函数,它会将Image
对象分配给公共变量image
。执行mxml并创建子项时,它会为公共变量Image
分配一个新的image
对象(而不是正确抛出错误)。现在,事件侦听器已添加到构造函数中创建的Image
实例中,但是当您在image.source
中设置setProperty
时,它完全是另一个对象。这就是为什么当你将事件监听器移动到setPicture
时它会起作用 - 你将它分配给新对象。
将mxml Image标记的id
更改为其他内容,即使从构造函数添加了事件侦听器,它也会起作用。将公共var图像的名称更改为其他名称,您将在PhotoClass
中收到编译时错误。
顺便说一句,mxml中的Image标签是做什么的 - 用于显示不同的图像?在这种情况下,您必须更改其id
。
<!-- MyCanvas.mxml -->
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Label id="lbl"/>
</mx:Canvas>
<!-- the main application class -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:local="*"
creationComplete="onCreate()" layout="vertical">
<local:MyCanvas id="canvas1"/>
<mx:Script>
<![CDATA[
public var canvas2:MyCanvas;
public function onCreate():void
{
this.canvas1.lbl.text = "MyCanvas_1";
canvas2 = new MyCanvas();
this.addChild(canvas2);
canvas2.addEventListener(FlexEvent.CREATION_COMPLETE, onCanvas2Created);
}
public function onCanvas2Created(e:FlexEvent):void
{
this.canvas2.lbl.text = "MyCanvas_2";
}
]]>
</mx:Script>
</mx:Application>
答案 1 :(得分:2)
我明白了......
eventListeners将不会注册,除非精灵附加到应用程序。在将精灵添加到其父类之前,在这种情况下的eventListener被添加到构造函数中。我将 image.addEventListener 移动到 setPicture 并且它有效。