Сценарий действия 3 - События между Spark и пользовательскими компонентами - PullRequest
0 голосов
/ 30 ноября 2010

Мы создаем интерфейс для игры.

Интерфейс имеет меню с вкладками в нижней части экрана, где каждая вкладка отображает различные аспекты объекта (называемого узлом).

Когда вы нажимаете на одну из этих частей, она становится основной, и мы загружаем ее детали в 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 прослушивал возврат, который обновит публичную переменную 'currentNode', когда загрузчик вызывает xmlDownloaded.

Если бы вы могли уточнить, как следует отправлять событие click, что должно ожидать его, а затем отправлять URLRequest и где должен быть URLLoader, который прослушивает возвращаемые данные XML, который решит наши проблемы. В качестве альтернативы, если есть лучший (более традиционный) способ сделать то, что мы пытаемся сделать, это также поможет, поскольку мы относительно новы в actionscript и flex.

1 Ответ

1 голос
/ 30 ноября 2010
 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;
 }
...