2009-08-14 3 views
0

여기에 제가 현재하려고하는 것이 있습니다. 나는 두 개의 매개 변수를 취하는 vdata.as라는 클래스를 가지고 있습니다. 둘 다 주 단계에서 전송 된 문자열입니다. 매개 변수 1은 열고 읽어야하는 XML 파일의 위치입니다. 두 번째 매개 변수는 현재 찾고있는 비디오의 이름입니다.AS3 견과류 운전

이제는 XML 파일에서 데이터를 가져 와서 내 수업에서 호출되었지만 스테이지에서 액세스하려고 할 때 정의되지 않습니다. 내가 메인 무대에서 호출 할 때 다음과 같이

import flash.net.*; 
import flash.display.*; 
import flash.events.*; 

public class videoData 
    { 
     private var mName:String; 
    private var mLink:String; 
    private var mCategory:String; 
     public static var elementArray:Array; 

     // Constructor 
    public function videoData(xmlPath:String,xmlVidSrc:String,pMC:MovieClip) 
    { 
     pXmlPath = xmlPath; 
    pXmlVidSrc = xmlVidSrc; 
    xmlloader = new URLLoader(); 
      elementArray = new Array(); 
    } 

     public function getXML() 
    { 
    XMLData(); 
     } 

     private function XMLData() 
    { 
     xmlloader.load(new URLRequest(pXmlPath)); 
    xmlloader.addEventListener(Event.COMPLETE,parseXMLData); 

     } 

     private function parseXMLData():void 
    { 
    var x:XML = new XML(xmlloader.data); 
     Init(x);  
    } 

     private function Init(m:XML):* 
    { 
     var i:Number; 
    for(i=0; i<m.videos.videoname.length(); i++) 
    { 
     if(m.videos.videoname[i][email protected] == pXmlVidSrc) 
     { 
     videoData.elementArray.push(m.videos.videoname[i][email protected]); 
     videoData.elementArray.push(m.videos.videoname[i][email protected]); 
     videoData.elementArray.push(m.videos.videoname[i][email protected]); 
       } 
    } 
}   

}

는 코드입니다.

var xData : videoData = new videoData (xmlPath, vidSrc, this); xData.getXML();

그런 다음 videoData.elementArray의 요소에 액세스하려고하면 정의되지 않은 정보가 나타납니다. 내 책상에서 내 머리를 때려 눕히면 어떤 도움이 될지 알 수 없습니다.

답변

0

"addEventListener"는 이벤트를 발생시키지 않습니다 ... 이벤트가 발생합니다. elementArray가 채워진 스테이지의 상태를 나타내는 부울을 추가하고 init 함수 이후에이를 설정해야합니다.

elementData는 모든 videoData 인스턴스에서 true 여야합니까? 그렇지 않은 경우 정적이어서는 안됩니다. MovieClip (this.root) .xData를 사용하여 다른 클래스 중 하나에서 비디오 클래스의 해당 인스턴스에 액세스 할 수 있습니다.

이벤트가 완료되고 어레이가 여전히 비어있는 경우 - 파서가 입력하지 않았습니다.

을 부울 변수 공용 멤버 바람직 읽기 전용 속성으로합니다 :

var parseComplete:Boolean; 
당신은 응답의 elementArray.length> 0

편집이 언급 있는지 확인하기 위해 검사를 할 수도 있습니다

생성자에서 false로 설정하십시오.

그런 다음하면 Event.COMPLETE 콜백 세트의 통화에서 "초기화"후 :

parseComplete=true; 

그런 다음 당신이 이제까지 elementArray에 액세스 == true를하기 전에 parseComplete을합니다. 무한 루프에

while(!xData.parseComplete) { } 

: 당신이 파서를 기다리고 있다면 당신은 어떤 종류의 원인이 타임 아웃하거나 예상치 못한 오류가있는 경우 시도/캐치 메커니즘의 일종을 설정할 수 있습니다 완료 . 그것은 모두 사용법에 달려 있습니다. 개인적으로는 이벤트 리스너의 콜백을 무대에 추가하여 다음에 일어날 일을 트리거 할 수 있습니다.

+0

감사합니다. 미안하지만 고통이 되겠지만 "무대에 진상을 알리기 위해 부울을 추가하십시오"라는 말의 의미를 알 수있을 것입니다. 생각이 있지만 확실하게하고 싶습니다. 그리고 elementArray는 사실 일 필요가 없습니다. 나는 정적을 제거했습니다. – 2Alpha

+0

크게 감사드립니다. – 2Alpha

+0

그 트릭을 한거야? – McAden

1

elementArray가 정적 var 인 이유는 무엇입니까? 함수 외부에서 사용하려면 public으로 설정하면됩니다.

매우 혼란 스럽지만 "De MonsterDebugger"와 같은 디버깅 도구를 사용해보고 싶을 수도 있습니다. 필자는 parseXMLData 함수에서 xmlloader.data를 추적합니다.

+0

기본적으로 XML 데이터를 배열로 가져 와서 기본 단계로 되돌려 주므로 XML 데이터를 응용 프로그램에서 사용할 수 있습니다.하지만 현재는 작동하지 않습니다. 내가 말한 것처럼 수업 중에 데이터를 볼 수는 있지만 메인 단계에서 데이터를 볼 수는 없습니다. 실제로 나는 addeventlistener가 발사 한 후에도 그것을 볼 수 없다. 디버거를 확인해보고 디버거가 무엇을 가지고 있는지 확인하십시오. – 2Alpha