2013-08-24 14 views
7

jestem konwersji mój AS3 codebase do maszynopis i napotkasz ten błąd:maszynopis - zachować zakres w słuchacza zdarzeń

kod AS3:

private function loadDataXml(assetsXml : String) : void { 
    var loader : URLLoader = new URLLoader(); 
    loader.addEventListener(Event.COMPLETE, handleDataLoaded); 
    loader.load(new URLRequest(assetsXml)); 
} 

private function handleDataLoaded(event : Event) : void { 
    var xml_data : XML = new XML(event.target.data); 
    parseData(xml_data); 
    ......... 
} 

private function parseData(xml_data : XML) : void { 
    ...... 
} 

kod maszynopis

private loadDataXml(assetsXml : string) { 
    var xmlRequest:XMLHttpRequest = new XMLHttpRequest(); 
    xmlRequest.addEventListener("load",this.handleDataLoaded, false); 
    xmlRequest.open("GET", assetsXml, false); 
    xmlRequest.setRequestHeader("Content-Type", "text/xml"); 
    xmlRequest.send(null); 
} 

private handleDataLoaded(evt:Event) { 
    var xmlDoc:Document = (<XMLHttpRequest> evt.target).responseXML; 
    this.parseXMLData(xmlDoc); 
    ...... 
} 

private parseData(xmlDoc:Document):void { 
    ...... 
} 

i uzyskać ten błąd "Uncaught TypeError: Object # nie ma metody" parseData "" z powodu tej linii xmlRequest.addEventListener .....

Próbowałem użyć funkcji strzałki, ale nadal nie mogłem jej naprawić (i uważam, że nie używam jej poprawnie)

Odpowiedz

16

Gdy potrzebujesz przekazać funkcje, użyj nowej składni lambdy dla zmiennych członków (wprowadzone w TypeScript 0.9.1):

private loadDataXml(assetsXml : string) { 
    var xmlRequest:XMLHttpRequest = new XMLHttpRequest(); 
    // you are passing a member function Use lambda to define this function: 
    xmlRequest.addEventListener("load",this.handleDataLoaded, false); 
    xmlRequest.open("GET", assetsXml, false); 
    xmlRequest.setRequestHeader("Content-Type", "text/xml"); 
    xmlRequest.send(null); 
} 

private handleDataLoaded = (evt:Event) => { // Since you want to pass this around 
    var xmlDoc:Document = (<XMLHttpRequest> evt.target).responseXML; 
    this.parseXMLData(xmlDoc); // you will get the correct this here 
    ...... 
} 

private parseData(xmlDoc:Document):void { 
    ...... 
} 
+1

Dziękuję. To działa. Próbowałem użyć funkcji strzałki w wywołaniu addEventListener, ale nie próbowałem jej użyć w metodzie obsługi. – user2694951

+1

Dzięki. Byłbym wdzięczny, że jest oznaczony jako odpowiedź – basarat

2

Przymierz wiążące się z zakresem

xmlRequest.addEventListener("load",this.handleDataLoaded.bind(this), false);