2013-11-21 156 views
1

我正在處理一些與dataContext相關的打字稿類的重構。事情是昨天我花了很多時間試圖弄清楚爲什麼我沒有從我的新數據上下文中獲得breeze.promise。最後我得到了解決方案,它與「this」的範圍有關。不好用的「本」的 例子:在打字稿類中使用「this」

public getSomething(){ 
    return this.manager.executeQuery(query) 
     .then(function (data) {    
      //THIS IS NOT WORKING" INSIDE OF THE FUNCTION 
      this.log('this log will never be loged :('); 
     } 
} 

現在相同的代碼工作正常,但用「」作爲臨時變量:

public getSomething(){ 
    var that=this; 
    return this.manager.executeQuery(query) 
     .then(function (data) {    
      that.log('get something is complete'); 
     } 
} 

如果你看到在abore第二件代碼工作正常,但我必須重複我的班級中的每種方法的過程。現在我的問題是: 如何在課堂級別創建一個「那個」變量?那可能嗎?

我試着用下面的代碼,但我得到一個編譯錯誤:「無法找到符號」,「。」

export class eventDataContext extends dataContextBase.dataContextBase { 
    public that; 

    constructor() {   
     super(); 
     that = this; 
    ... 
    } 
} 

任何想法如何把這個新的變量「那」在課堂上?謝謝!

+0

[JavaScript:爲什麼理解範圍和閉包重要](http://doctrina.org/JavaScript:Why-Understanding-Scope-And-Closures-Matter.html)是一個很好的閱讀 – Satpal

+0

綁定應該這樣的技巧https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind – rafaelcastrocouto

+0

謝謝@SteveFenton給了我一個明確的答案! – Rolando

回答

3

打字稿有一個方便的快捷方式來解決這個問題,所謂的「胖箭頭語法」 =>

如果您使用以下,它應該爲你工作:

getSomething(){ 
    return this.manager.executeQuery(query) 
     .then((data) => {    
      this.log('This *will* now be logged :)'); 
     }); 
} 

快速免責聲明 - 我不知道你的query是從哪裏來的 - 它不會傳遞到getSomething方法。如果它是一個類屬性,請使用this.query

+0

非常好!謝謝! – Rolando