2013-11-12 3 views
0

У меня есть класс AS3, который анализирует xml и создает кнопки для элемента foreach в XML. Однако я хочу получить доступ к общему количеству элементов позже. Как я могу это сделать?Action Script 3 возвращает значение из класса

Я использую его вот так.

var menu:MenuClass = new MenuClass(); 
trace(menu.aItems()); 

Прямо сейчас она перенастройки NAN однако если я проследить его после строки Items = xml.item.length(); выводит правильный номер.

package com.lib.menu 
{ 
    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 

    public class MenuClass extends MovieClip { 

     private var urlLoader:URLLoader; 
     private var urlRequest:URLRequest; 
     private const XML_PATH:String = "resources/menu.xml"; 
     private var xml:XML; 
     protected var Items:Number; 

     public function MenuClass() { 

      urlLoader = new URLLoader(); 
      urlLoader.load(new URLRequest(XML_PATH)); 
      urlLoader.addEventListener(Event.COMPLETE, xmlLoaded); 
     } 
     private function xmlLoaded(e:Event):void 
     { 
      xml = new XML(e.target.data); 
      Items = xml.item.length(); 
      for (var i:int = 0; i < Items; i++) { 
       var btn:Button = new Button(xml.item[i][email protected],xml.item[i][email protected]); 
       btn.y = Math.floor(i * (btn.height+2)) ; 
       addChild(btn); 
      } 
     } 
     public function aItems():Number { 
      return Items; 
     } 

    } 

} 
+2

Это происходит потому, что при обращении к 'Aitems()', ваш XML не был загружен еще. Поэтому вам нужно изменить способ доступа к количеству элементов. – putvande

+0

Именно то, что написал вам письмо. Плюс ... не используйте капитал I в Items, он выглядит как класс ... – Fygo

ответ

3

URLLoader загружает данные асинхронно, что означает конструктор MenuClass не ждать загрузки, чтобы закончить. По завершении загрузки XML xmlLoaded будет вызываться, а действительное значение будет установлено на Items. Но вы пытаетесь получить доступ к Items сразу после создания объекта, то есть до того, как вызывается xmlLoaded. Таким образом, вы получаете NaN в этот момент.

0

Ok. Я решил эту проблему, добавив this.dispatchEvent(new Event("MenuComplete")); до конца private function xmlLoaded(e:Event):void, а затем

var menu:MenuClass = new MenuClass(); 
menu.addEventListener('MenuComplete', onNext); 
function onNext(e:Event):void{ 
    trace(menu.aItems()); 
} 
Смежные вопросы