2016-06-10 48 views
1

我有公共打字稿類型,像這樣:打字稿回調到外部文件綁定「this」關鍵字

export class Generator { 

    public generate(settings: GeneratorSettings): void { 

     $('#' + settings.Id+ "").dataTable({ 
      dom: 'RC<"clear">rti<"bottom"pl>', 
      sAjaxSource: settings.sourceUrl, 
      bServerSide: true, 
      pageLength: 15, 
      lengthMenu: [15, 25, 50, 100], 
      fnDrawCallback: (oSettings) => { this.internalCallback(oSettings); settings.publicCallback(); } 
     }); 
    } 

    private internalCallback(oSettings: any) { 
     // Do work 
    } 

在這種情況下,我使用的是第三方庫(jQuery的數據表),它提供了一個回調函數。爲了讓稍後使用此類型的用戶能夠與事件掛鉤,我在我的設置中包含了一個公開的publicCallback屬性,該類型的用戶可以將其設置爲各自的功能。正在使用的publicCallback

一個實例是這樣的:

在HTML聯腳本我有:

settings.publicCallback = externalModule.initialise; 

哪裏externalModule是另一種打字原稿類型的實例如下:

export class ExternalModule { 

    public initialise() { 

     // Various things happen before here 

     $("#button").on("click", (event) => { 
      this.buildIdList(event); 
     }); 
    } 

    private process(event: any){ 

     // Doing work 

    } 

我的問題在於ExternalModule.initialise函數。由於它正從另一個TypeScript模塊中調用,此時的關鍵字thispublicCallback屬性所在的settings參數。

我已閱讀this關鍵字,我明白爲什麼發生這種情況,但是我無法找到解決辦法。我試圖做的Generator類型如下:

fnDrawCallback: (oSettings) => { this.internalCallback(oSettings); settings.publicCallback.bind(settings.publicCallback)(); 

但是這使得沒有幫助,因爲現在this在剛剛initialise方法關鍵字點。

+0

當你有權訪問這個時,你需要將它存儲在一個變量中,並訪問該變量 – 2426021684

+0

我從來沒有問題到我想要的'this'上下文。只要'initialise'函數被調用,'this'就有'settings'參數的上下文 - 沒有機會捕獲正確的上下文。 – FLSH

回答

1

可以使用Function.prototype.bind功能,像這樣:

settings.publicCallback = externalModule.initialise.bind(externalModule); 

它會的externalModule範圍保存爲this對象,然後你的箭頭回調函數將有正確的this爲好。

+0

謝謝,這就是我一直在尋找的東西。有沒有什麼辦法可以將它放在'Generator'類型中以保持回調消耗簡單,或者就目前而言這是不可能的? – FLSH

+0

您需要'externalModule'的實例來綁定或應用/調用其初始化方法,但是(據我所知)在執行'Generator.generate'函數時沒有實例。你也可以在設置中傳遞實例,然後你可以:'settings.publicCallback.bind(settings.publicCallbackThis)',但這很奇怪,因爲你可以將一個綁定函數傳遞給設置從開始(正如我在我的回答中所做的那樣)。 –