2011-12-04 2 views
1

이벤트 핸들러 함수 중에 값을 my xml 객체 (xml = new XML (e.currentTarget.data);)로 설정합니다 (이 함수는 실행됩니다. 이벤트 후. COMPLETE) 내 이벤트 함수 핸들러 내에서 객체를 추적하면 내 xml 데이터가 표시됩니다.Actionscript 3 - 이벤트를 제거한 후 이벤트의 값을 유지하는 방법

그러나 이벤트 처리기 함수 외부에서 추적하려고하면 내 xml 내용이 표시되지 않습니다. 내 XML 객체의 내용 값을 다른 함수에 표시 할 수는 있지만 이벤트 처리기 함수에는 표시하지 않는 방법이 있습니까?

private var xml:XML; 

public function XMLLoader(xmlURL:String) 
{ 
    var xmlURLRequest:URLRequest = new URLRequest(xmlURL); 
    var xmlURLLoader:URLLoader = new URLLoader(xmlURLRequest); 
    xmlURLLoader.addEventListener(Event.COMPLETE, xmlData); 
} 

private function xmlData(e:Event):void 
{ 
    e.currentTarget.removeEventListener(Event.COMPLETE, xmlData); 
    xml = new XML(e.currentTarget.data); 
    dispatchEvent(new Event(Event.COMPLETE)); 
    trace(xml); 
} 

public function getXMLData():void 
{ 
    //I've find out that this shows null because this function is faster 
    //what do i do? put an event.complete in every following function? 
    trace(xml); 
} 

감사합니다.

+0

private var xml : XML; \t \t 공공 기능 XMLLoader (xmlURL : 문자열) { \t \t \t var에 xmlURLRequest \t : 된 URLRequest \t = 새로운 된 URLRequest (xmlURL); \t \t \t var xmlURLLoader \t : URLLoader \t = 새 URLLoader (xmlURLRequest); \t \t \t \t \t \t xmlURLLoader.addEventListener (해서 Event.COMPLETE, XMLDATA); \t \t \t \t} \t \t 전용 기능 XMLDATA (예 : 이벤트) : 무효 { \t \t \t e.currentTarget.removeEventListener (해서 Event.COMPLETE, XMLDATA); \t \t \t \t \t \t XML = 새 XML (e.currentTarget.data); \t \t \t \t \t \t dispatchEvent (new Event (Event.COMPLETE)); \t \t \t trace (xml); \t \t \t \t} \t \t 공개 getXMLData 함수() {공극 \t \t \t 트레이스 (XML); \t \t – bunnyannihilator89

+0

XMLLoader를 설치하고 getXMLData() 메소드를 호출하면 코드를 게시 할 수 있습니까? –

+0

공용 클래스 XMLLoader는하는 EventDispatcher {\t \t 개인 var에 XML을 확장 : XML을; \t 공공 기능 XMLLoader (xmlURL : 문자열) { \t var에 xmlURLRequest : 된 URLRequest = 새하는 URLRequest (xmlURL); \t \t var에 xmlURLLoader :은 URLLoader = 새로운은 URLLoader (xmlURLRequest); \t xmlURLLoader.addEventListener (Event.COMPLETE, xmlData); \t \t \t \t} 전용 기능 XMLDATA (예 : 이벤트) : 무효 { \t \t e.currentTarget.removeEventListener (해서 Event.COMPLETE, XMLDATA); \t \t xml = new XML (e.currentTarget.data); \t \t dispatchEvent (새 이벤트 (Event.COMPLETE))); \t \t 추적 (XML); //이 하나가 \t \t} \t \t 공공 기능 getXMLData()를 보여줍니다 : XML { \t \t \t 추적 (XML); //이 것은 표시되지 않습니다 \t \t} \t} – bunnyannihilator89

답변

0

// 참고 : USE THIS 귀하가 CLASS 원인에 대한 모든 이벤트 리스너를 사용하지 않고 "클래스"의 기능에 직접 액세스하려면 IT가 이미 이벤트가 각 함수에 대한 리스너 (이 경우 하나의 함수 만 getXMLData())

private var xml : XML;

공공 기능 XMLLoader (xmlURL : 문자열) {

 var xmlURLRequest:URLRequest = new URLRequest(xmlURL); 
    var xmlURLLoader:URLLoader = new URLLoader(xmlURLRequest); 
    xmlURLLoader.addEventListener(Event.COMPLETE, xmlData); 

}

개인 기능 XMLDATA (예 : 이벤트) : 무효 {

 e.currentTarget.removeEventListener(Event.COMPLETE, xmlData); 
    xml = new XML(e.currentTarget.data); 
    dispatchEvent(new Event(Event.COMPLETE)); 
    trace("1");//this used to come second of getXMLData() but it's solved now 
    trace(xml); 

}

공용 함수 getXMLData() : void {

 //This function was coming first so if you don't want to use an event listener outside  
    //this class to wait for event.complete you can use it here to wait for it and access 
    //the function directly without being afraid of the object being null: 
    addEventListener(Event.COMPLETE, go) 
    function go(e:Event){ 
      trace("2"); //now it ONLY comes AFTER the event.complete, no need for external     listeners over this class. declare the class object and use getXMLData() directly cause it always comes second the event handler xmlData() :) 
      trace(xml); 
    } 
} 
1

xml 개체가 아직 null 인 경우 XMLLoader() 다음에 getXMLData() 즉시로 전화를 걸 것이라고 생각합니다. getXMLData()(xmlData())을 호출하면 차이가 나타납니다.

+0

"xml = new XML (e.currentTarget.data);"후에도 문제가 발생합니다. 이벤트 처리기에서 이벤트 처리기 외부에서 xml을 추적하고자 할 때 값이 더 이상 존재하지 않습니다. 그 시점은 null이고 event.complete 이후에 필요할 때 globally 액세스가 가능하도록하고 싶습니다. – bunnyannihilator89

+0

문제가 무엇인지 알기가 어렵습니다. 'XMLLoader'와'getXMLData'에 대한 호출과 함께 전체 코드를 게시 할 수 있습니까? – package

+0

나는 벌써 무슨 일이 있었는지 게시했다. 포스트 벨로우즈를 지켜 보아라. 고마워요 ^^ – bunnyannihilator89

0

URLLoader가 완료되기 전에 getXMLData()를 호출하는 것이 일반적이지만, 일반적으로 실행중인 코드는 좋지 않습니다. Actionscript는 전혀 차단하지 않으므로 URLRequest를 사용하여 새 URLLoader를 인스턴스화하면 즉시로드 작업이 시작됩니다. 예를 들어, 파일이 캐시 된 경우로드 작업을 시작한 후에 Event.COMPLETE 리스너가 연결될 때 이벤트가 발생하지 않을 수 있습니다.

내가 작성하고 데이터를로드하기위한 이상적인 방법 아래에 첨부했습니다는 :

var data:XML; 
var urlLoader:URLLoader = new URLLoader(); 

urlLoader.addEventListener(Event.COMPLETE, urlLoader_completeHandler); 
urlLoader.load(new URLRequest("path")); 

private function urlLoader_completeHandler(event:Event):void 
{ 
    data = new XML(urlLoader.data); 
} 

당신이 당신의 자신의 XMLLoader 클래스에이를 적용 할 경우에, 나는 AS3에서 "적절한"구현을 포함 시켰습니다 .. . 아주 자세한. 행운을 빕니다

var xmlLoader:XMLLoader = new XMLLoader(); 
xmlLoader.addEventListener(XMLLoaderEvent.COMPLETE, function(event:XMLLoaderEvent):void 
{ 
    trace(event.data); 
}); 

xmlLoader.load(new URLRequest("data.xml")); 

:

import flash.net.URLLoader; 
import flash.events.Event; 

class XMLLoader extends URLLoader 
{ 
    public function XMLLoader() 
    { 
     super(); 
     addEventListener(Event.COMPLETE, completeHandler); 
    } 

    private function completeHandler(event:Event):void 
    { 
     dispatchEvent(new XMLLoaderEvent(XMLLoaderEvent.COMPLETE, new XML(data))); 
    } 
} 

class XMLLoaderEvent extends Event 
{ 
    public static const COMPLETE:String = "xmlLoaderComplete"; 

    public var data:XML; 

    public function XMLLoaderEvent(type:String, data:XML = null, bubbles:Boolean = false, cancelable:Boolean = false) 
    { 
     super(type, bubbles, cancelable); 

     this.data = data; 
    } 

    override public function clone():Event 
    { 
     return new XMLLoaderEvent(type, data, bubbles, cancelable); 
    } 
} 

는 XMLLoader 클래스를 사용하려면!

+0

나는 이것이 나쁜 습관이라는 것에 동의하지 않을 것이다. HTTPRequest 또는 RemoteObject에 리스폰 더를 추가하면 send()를 호출해야만 토큰에 액세스 할 수 있습니다. 실제로는 응답자를 추가하는 것입니다. 메서드 본문에서 함수를 호출하지 않거나 함수가 elswhere라는 결과를 초래하는 이벤트를 보내지 않는 한 리스너 또는 응답자를 다음 줄에 연결하는 것은 완벽합니다. 또한 이벤트 상수를 정의하기 위해 새로운 이벤트 유형을 만들 필요가 없습니다 (URLLoader에는 필요한 모든 이벤트가 있음). –

+0

@stat 이것은 내 말 뜻입니다. 당신은 첫 x ​​째 코드, xml 파일을 여는 데 적합한 코드를 보았습니까? 데이터 객체가 "urlLoader_completeHandler"함수 후에도 XML 내용을 유지하기를 원하므로 "data = new XML (urlLoader.data);" "urlLoader_completeHandler"함수 외부의 추적 데이터에도 액세스 할 수 있지만, 그 밖의 데이터를 추적하는 경우에는 null로 표시됩니다. 해결책이 없습니까? 그래서 evrytime 내가 event.complete을 통과해야 데이터에 액세스해야합니까? – bunnyannihilator89

+0

이제 코드의 두 번째와 세 번째 부분을 보게 될 것이지만 나는 당신에게 말할 것입니다.하지만 내가 말한 첫 번째 것은 내 코드와 같은 결과를줍니다. 건배 – bunnyannihilator89

0

추적 방법을 변경하여 XML이 아직로드되었는지 여부를 나타냅니다.
당신은 경쟁 조건으로 실행하는

private var _xmlLoaded:Boolean=false;// add this to see if the xml is loaded 
private function xmlData(e:Event):void 
{ 
    e.currentTarget.removeEventListener(Event.COMPLETE, xmlData); 
    xml = new XML(e.currentTarget.data); 
    _xmlLoaded=true; 
    dispatchEvent(new Event(Event.COMPLETE)); 
    trace(xml); 
} 
public function getXMLData():void 
{ 
    if (_xmlLoaded) 
     trace(xml); 
    else 
     trace("not yet loaded"); 
} 
+0

나는 내가 묻는 것을 얻고 있다고 생각한다. 나는 곧 코드를 테스트하고 당신에게 뭔가를 말할 것이다. 건배 – bunnyannihilator89