操作脚本3 - Spark和自定义组件之间的事件

时间:2010-11-30 03:30:08

标签: actionscript-3 events flex4

我们正在为游戏构建界面。

界面在屏幕底部有一个标签式菜单,每个标签显示一个对象的不同方面(称为节点)。

当你点击其中一个部分时,它就成了焦点,我们用XML下载它的详细信息,包括它的所有子节点和父节点,然后相应地更新标签显示,或者至少这是我们的喜欢发生。

我们拥有什么:

MainInterface.mxml

<s:Application...
<fx:Script>
  <![CDATA[
    public var currentNode:Node = new Node();

    protected function selectNodeHandler(event:Event):void
      {
        loader = new URLLoader(new URLRequest(ourWebSite + event.target.id + ".xml"))
        //the xmlDownloaded function below is what changes the contents of currentNode
        loader.addEventListener(Event.COMPLETE, xmlDownloaded);
...
<s:SkinnableContainer  id="dashBoard"..
  <mx:TabNavigator...
    <s:NavigatorContent...
      <s:SkinnableDataContainer ...
        dataProvider="{currentNode.children}"
        itemRenderer="renderers.NodeRenderer">

Node.as(valueObjects.Node)

...
  [Bindable] public var id:String;
  [Bindable] public var name:String;
  [Bindable] public var children:ArrayCollection = new ArrayCollection();
  [Bindable] public var parents:ArrayCollection = new ArrayCollection();
...

NodeRenderer.mxml(renderers.NodeRenderer)

<s:ItemRenderer ... click="nodeRenderer_clickHandler(event)">
<fx:Script>
  <![CDATA[
    protected function nodeRenderer_clickHandler(event:MouseEvent):void
    {
      var eventObject:Event = new Event ("nodeSelected");
      dispatchEvent(eventObject);
    }
 ...
 <s:Label text = "{data.name}"/>

我们尝试将“selectNode”的事件监听器添加到dashBoard:您看到上面看到的SkinnableContainer,但它似乎不想采取。我们怀疑这是因为dashBoard来自一个spark组件而“selectNode”的调度程序是我们自己的自定义组件,但是我们不确定......在任何情况下代码辅助似乎表示我们必须手写。

我们不确定如何在FlashBuilder 4的调试器中获取事件,因此我们无法解决它出错的地方。基本上,当有人点击子节点或父节点的标签(由itemRenderer显示)时,我们希望将URLRequest发送到我们的网站,并点击特定于该节点的URL。然后我们想要一个URLLoader监听返回,当加载器调用xmlDownloaded时,它将更新公共变量'currentNode'。

如果您可以澄清应该如何调度click事件,那么应该监听它,然后发送URLRequest以及正在侦听要返回的xml数据的URLLoader将解决我们的问题。或者,如果有更好的(更常规的)方式来做我们正在尝试做的事情也会有所帮助,因为我们对actionscript和flex相对较新。

1 个答案:

答案 0 :(得分:1)

 protected function selectNodeHandler(url:String):void
  {
    loader = new URLLoader(new URLRequest(url));

    //consider identifying the loader, for instance
    loader.name = url; // you could also pass a second parameter 
    //to the function and assign it to the name property of the loader.

    //the xmlDownloaded function below is what changes the contents of currentNode
    loader.addEventListener(Event.COMPLETE, xmlDownloaded);
  }


 protected function nodeRenderer_clickHandler(event:MouseEvent):void
 {
     var url:String = ourWebSite + event.currentTarget.id + ".xml";
     selectNodeHandler( url );
 }

 protected function xmlDownloaded( event:Event ):void
 {
      //identify the target here with the name property
      var id:String = event.target.name;
 }