Typescript:从函数委托访问注入的函数

时间:2015-11-10 15:28:34

标签: javascript angularjs typescript

我们正在将现有的angularjs app移植到打字稿。由于这是一项正在进行的工作,我们使用“任何”类型非常重要(只是为了澄清)。

目前我们正在重写其中一个较大的服务,但它大量使用Angular的$http服务,我正试图弄清楚如何执行以下操作:

我们在一个包含很多功能的服务上公开了一个方法。这是基本课程(dumbed down version):

class MyService implements IMyService {
    static $inject = ["$http", "MyException"];

    constructor(private $http: ng.IHttpService, private MyException: any) {
    }

    search(searchType: string, page: number): ng.IPromise<any> {
        var apiCall = // Not important.
        return this.executeApiCall(apiCall, this.onSearchComplete);
    }

    private executeApiCall(apiCall: string, onDataComplete: any): ng.IPromise<any> {
        var request: any = {
            method: "GET",
            url: apiCall
        };

        return this.$http(request).then(onDataComplete);
    }

    private onSearchComplete(response: any): any {
        if(!response.hasOwnProperty(Stuff)) {
            var customError = new MyException(); // CAN'T ACCESS MyException!!
        }
    }
}

我的问题是,由于onSearchComplete回调是作为委托传递的,因此我不知道如何从中访问MyException

this关键字在该函数的正常意义上不可用,这是我在TS中访问类属性的常规方法。

我尝试使用类似的东西:

return this.executeApiCall(apiCall, this.onSearchComplete.bind(this)); 

但这似乎没有做任何事情,因为编译的JavaScript与没有bind的完全相同的语句没有什么不同。

我的Google-foo在这里失败了,因为我还是TypeScript的新手,无法弄清楚如何完成上述工作。

如果我需要提供更多详细信息,请与我们联系。

1 个答案:

答案 0 :(得分:1)

首先,MyException未在onSearchComplete方法范围内定义,它是

var customError = new this.MyException();

this.onSearchComplete.bind(this)可以完成这项工作。它是JS feature并且在编译时没有做任何事情。但是这样做的最好方法是arrow function,它特别用于在函数内部引入词法this

private onSearchComplete = (response: any): any => {
    if(!response.hasOwnProperty(Stuff)) {
        var customError = new this.MyException();
    }
}

事件处理程序是最明显的用例。