加载URL时不会触发Event.Complete

时间:2010-08-11 19:02:11

标签: flex actionscript-3

我是一名经验丰富的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");
    }
}

2 个答案:

答案 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 并且它有效。