2017-09-01 79 views
2

在角2個應用程序,我想存儲在一個變量的方法,但稱它總是拋出一個錯誤。我會更好以下解釋:調用的方法存儲在一個變量中打字稿

我有3種不同的API方法要求更新數據庫,根據用戶的類型:客戶,合作者或供應商。這就是我現在所擁有的:

let updateAPIMethod; 

switch (user.type) { 
    case OBJTYPES.CUSTOMER: 
     updateAPIMethod = this.customerService.updateCustomer; 
     break; 
    case OBJTYPES.COLLAB: 
     updateAPIMethod = this.collaboratorService.updateCollaborator; 
     break; 
    case OBJTYPES.PROVIDER: 
     updateAPIMethod = this.providerService.updateProvider; 
     break; 
} 
updateAPIMethod(user).subscribe((ret) => { DEAL WITH SUCCESS }, 
    (error) => { DEAL WITH ERROR }); 

每個功能是http.put調用返回可觀察到的。當我運行上面的代碼我得到:

TypeError: Cannot read property 'http' of undefined 

我想這是因爲只是調用該函數不設置此時,相應的「本」的價值,但我不知道......

是否有如何做我想做的事?謝謝!

+0

你真的打算'invoke'在這條線的功能? :'... = this.collaboratorService.updateCollaborator();' – Arg0n

+0

具有u輸入http模塊從@角/ HTTP在哪裏你使用HTTP服務 –

+0

你可能錯過了'.bind(...)'或' =>'這打破了'綁定',但我沒有看到r在你的問題中你通過函數做出更具體的建議如何修復的代碼。 –

回答

4

您寬鬆背景下,當你從分離的基礎對象的方法。因此您的服務中的this.httpundefined

這應該工作:

let updateAPIMethod; 

switch (user.type) { 
    case OBJTYPES.CUSTOMER: 
     updateAPIMethod = this.customerService.updateCustomer.bind(this.customerService); 
     break; 
    case OBJTYPES.COLLAB: 
     updateAPIMethod = this.collaboratorService.updateCollaborator.bind(this.collaboratorService); 
     break; 
    case OBJTYPES.PROVIDER: 
     updateAPIMethod = this.providerService.updateProvider.bind(this.providerService); 
     break; 
} 
updateAPIMethod(user).subscribe((ret) => { DEAL WITH SUCCESS }, 
    (error) => { DEAL WITH ERROR }); 

你也可以用bind operator縮短(可能需要transform-function-bind巴貝爾插件):

switch (user.type) { 
    case OBJTYPES.CUSTOMER: 
     updateAPIMethod = ::this.customerService.updateCustomer; 
     break; 
// ... 
相關問題