查询类的监听器的状态

时间:2009-12-13 04:30:12

标签: flex actionscript-3

我已经实例化了一个类(class1),它在AS3 Flex项目中通过PHP加载一些数据。 我实例化class1,它是异步的,并使用URLLoader()来获取其数据。

然后我想实例化class2,它需要使用class1中的数据,但是当我只是实例化它时,我发现class1的实例变量还没有填充,因为我太快了调用class2。

如何创建可正确链接的依赖项? 我真的很擅长使用听众,但我想象一下class2中的听众可能就是我需要的? 或者也许我可以将class1中的监听器的引用传递给class2? 我对调度事件一无所知......这是关键吗?

以下是伪代码中的示例:

var class1:myC1 = new myC1("http://some/url/to/utilize");
//this never shows up because it hasn't loaded at the time i request it
trace("the stuff from class1 is: ", class1.myXMLList);
//and of course i can't use it here either
var class2:myC2 = new myC2(0x000000, class1.myXMLList);

感谢您的帮助, JML

2 个答案:

答案 0 :(得分:2)

根据你的问题,我发布这个“伪代码”跳跃它会帮助

package {

  import flash.events.Event;
  import flash.events.EventDispatcher;
  import flash.net.*;

  public class Class1 extends EventDispatcher {
    private var _loader:URLLoader;

    public var data:XMLList;

    public function Class1(url:String) {
      _loader = new URLLoader();
      _loader.addEventListener(Event.COMPLETE, completeHandler);
      // rest of the code here ....

      _loader.load(new URLRequest(url));
    }

    protected function completeHandler(event:Event):void {
      data = new XMLList(_loader.data); // probably wrong but
                                        // I figured you had already
                                        // implemented this part

      dispatchEvent(new Event(Event.COMPLETE));
    }
  }
}

我认为第2课可能看起来像这样

package {

  public class Class2 {

    // your stuff here

    public function Class2(color:uint, data:XMLList) {

    }
  }

}

主要课程

package {

  import flash.display.Sprite;
  import flash.events.Event;

  public class Main extends Sprite {

    public var c1:Class1;
    public var c2:Class2;

    public function Main() {
      c1 = new Class1("http://some/url/to/utilize");
      c1.addEventListener(Event.COMPLETE, completeHandler);
    }

    protected function completeHandler(event:Event):void {
      c2 = new Class2(0xffcc00, c1.data);
    }
  }

}

希望这有帮助

答案 1 :(得分:1)

如果您希望Flex / FlashBuilder自动完成类的事件,可以在类定义之前使用“Event”元数据标记。根据上面的例子,它看起来像这样

package {

  import flash.events.Event;
  import flash.events.EventDispatcher;
  import flash.net.*;

  // use the "Event" metadata tag 

  [Event(name="complete", type="flash.events.Event")]

  public class Class1 extends EventDispatcher {

        private var _loader:URLLoader;

        public var data:XMLList;

        public function Class1(url:String) {
          _loader = new URLLoader();
          _loader.addEventListener(Event.COMPLETE, completeHandler);
          // rest of the code here ....

          _loader.load(new URLRequest(url));
        }

        protected function completeHandler(event:Event):void {
          data = new XMLList(_loader.data); 
          dispatchEvent(new Event(Event.COMPLETE));
        }
  }
}

现在FlexBuilder / FlashBuilder应该“自动完成”该类的事件。 缺点是您不能将“常量”与“事件”元数据标记一起使用,因此:

[Event(name=Event.COMPLETE, type="flash.events.Event")]

无效。

您可以阅读有关事件/事件发送here的更多信息。

希望有所帮助:)