2013-08-24 36 views
7

我我的AS3代碼庫轉換爲打字稿和運行這個錯誤:打字稿 - 在事件偵聽器保留範圍

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 { 
    ...... 
} 

打字稿代碼

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 { 
    ...... 
} 

和我這個錯誤「Uncaught TypeError:Object#has no method'parseData'」because this line xmlRequest.addEventListener .....

我已經嘗試使用箭頭功能,但仍然無法修復它(並且我不認爲我正確使用它)

回答

16

當您需要傳遞函數時使用新的lambda語法用於成員變量(在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

謝謝。這工作。我嘗試在addEventListener調用中使用箭頭函數,但沒有嘗試在處理程序方法中使用它。 – user2694951

+1

謝謝。將不勝感激它被標記爲答案 – basarat

2

儘量結合範圍

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