2011-05-04 3 views
1

플래시에서 생성 된 클래스의 범위에 문제가 있습니다. XML을 사용하여 XML로 조작하고 다시 저장하는 정보 배열을 만드는 응용 프로그램을 만들고 있습니다.AS3 범위 문제

나는 XML을로드하고 배열로 변환하고 배열을 문서 생성자에게 메서드를 사용하여 반환하기 위해 사용하고있는 다른 클래스를 호출하는 문서 클래스가 있습니다. XML을 성공적으로 구문 분석하고 데이터 배열을 만들었지 만 loadXMLData 클래스 내부의 processXML 함수를 통해 배열에 데이터를 추가 할 수 없습니다.

나는 중요하지 않은 코드에서 모든 것을 제거했습니다. 다음은 내가하려는 일의 기본 표현입니다.

내 문서 클래스

package { 

    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 
    import flash.utils.*; 


    public class dashBoard extends MovieClip { 

     public var newData 

     //initialize the dashBoard 
     public function dashBoard(){ 

      //construct the Dashboard Object 
      trace("Dashboard Initialized"); 
      trace("|--------------XML Data--------------|"); 
      newData = new loadXMLData(); 
      trace(newData.getSections()); 


     } 

    } 

} 

내 loadXMLData 클래스

package { 

     import flash.display.MovieClip; 
     import flash.events.Event; 
     import flash.net.URLLoader; 
     import flash.net.URLRequest; 
     import flash.utils.*; 

     public class loadXMLData extends MovieClip { 

       //initialize an array that will be used in the document class 
       public var sectionList:Array = new Array(); 

       public function loadXMLData() { 

        //load the xml file containing the data 
        var myLoader = new URLLoader(); 
        myLoader.load(new URLRequest("dashboard.xml")); 
        myLoader.addEventListener(Event.COMPLETE, processXML); 

       function processXML(e:Event):void { 

        //process the xml file after it loads 
          //and create an object 
        var newXML:XML = new XML(e.target.data); 

          //then I use the XML to populate my 
          //array i declared at the top 
          //this is a simple test 
          sectionList[0] = "test"; 

       } 

      } 

       //and this is the method i use in the document class 
       //to get the sectionList array 
      public function getSections():Array{ 
       return sectionList; 
       } 

     } 

    } 

그것은 매우 간단 보이지만 내가 배열을 편집 할 수없는 것. 문서 클래스는 항상 빈 배열을 반환합니다. 어떤 아이디어?

답변

1

당신은 XML이로드가 완료과 같이했을 때 아직 loadXMLData.processXML() 기능에서 이벤트를 exist.Dispatch하지 않는 정보에 액세스하려는 : 당신은 아무것도하기 전에

function processXML(e:Event):void 
{ 

    //process the xml file after it loads 
    //and create an object 
    var newXML:XML = new XML(e.target.data); 

    dispatchEvent(new Event("xml_loaded")); 

} 

이 그 다음 수신을 이렇게 :

package 
{ 
    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 
    import flash.utils.*; 


    public class dashBoard extends MovieClip 
    { 

     public var newData:loadXMLData; 

     //initialize the dashBoard 
     public function dashBoard(){ 

      //construct the Dashboard Object 
      trace("Dashboard Initialized"); 
      newData = new loadXMLData(); 

      newData.addEventListener("xml_loaded", _xmlLoaded); 
     } 

     private function _xmlLoaded(e:Event):void 
     { 
      trace("|--------------XML Data--------------|"); 
      trace(newData.getSections()); 
      newData.removeEventListener("xml_loaded", _xmlLoaded); 
     } 
    } 
} 
+0

당신은 최고입니다! 모든 도움에 감사드립니다. 나는 객체 지향 프로그래밍에 익숙하지 않고 얼마나 강력한지를보기 시작했다. – Laurence

0

범위 문제가 아니므로 loadXMLData를 구성한 다음로드를 기다리지 않고 바로 sectionList를 가져 오려고합니다. getSections에 대한 생성자 호출 및 호출은 동기식이지만 실제 XML 파일로드는 비동기입니다.

이상적으로, 당신의 loadXMLData 객체는 문서 클래스가 수신하는 processXML 핸들러 함수에서 COMPLETE 이벤트를 전달합니다 (로더가 완료 될 때까지 당신의 loadXMLData가 수신하는 것처럼)

1

는 그 아주 진짜 가능성이있다 행 : trace(newData.getSections()); 은 processXML 함수보다 먼저 발생합니다. 이는 배열을 채 웁니다. 이는 processXML이 Event.COMPLETE에 응답하고 있기 때문에 완료하는 데 몇 초가 걸릴 수 있습니다.

문서도 출력하려고하기 전에 (로더 클래스가 전달해야하는) 이벤트를 '수신 대기'해야합니다.