【问题标题】:Can't access this from $http callback无法通过 $http 回调访问它
【发布时间】:2016-05-28 00:42:07
【问题描述】:

我正在使用带有 typescript 的 angular 1.5,我无法从 $http 承诺返回的回调中访问 this 属性。

当我试图从回调中访问私有方法时,“this”未定义

我有以下 ServerAPI 服务:

export class ServerAPI implements IServerAPI {
    static $inject:Array<string> = ['$http', '$q'];

    constructor(private $http:ng.IHttpService,
                private $q:ng.IQService) {
    }

    postHandler(partialUrl:string, data?:any, config?:any):ng.IPromise<any> {
        let url = this.buildUrl(partialUrl);

        var result:ng.IPromise< any > = this.$http.post(url, data, config)
            .then((response:any):ng.IPromise<any> => this.handlerResponded(response, data))
            .catch((error:any):ng.IPromise<any> => this.handlerError(error, data));

        return result;
    }

    private handlerResponded(response:any, params:any):any {
        response.data.requestParams = params;
        return response.data;
    }

    private handlerError(error:any, params:any):any {
        error.requestParams = params;
        return error;
    }
}

被user.service消费的:

export class UserService implements IUserService {
    static $inject:Array<string> = ['$q', 'serverAPI'];

    constructor(private $q:ng.IQService,
                private serverAPI:blocks.serverAPI.ServerAPI) {
        var vm = this;
        $rootScope.globals = $rootScope.globals || {};
        $rootScope.globals.currentUser = JSON.parse($window.localStorage.getItem('currentUser')) || null;

        this.getUserPermissions();
    }

    private getUserPermissions:() => IPromise<any> = () => {
        var promise = this.serverAPI.postHandler('MetaDataService/GetUserPermissions',
            {userID: this.getUser().profile.UserID})
            .then((res) => {
                this.updateUser('permissions', res.GetUserPermissionsResult); // NOT WORKING, this is undefined
            })
            .catch((response:any):ng.IPromise<any> => {
                this.updateUser('permissions', res.GetUserPermissionsResult); // NOT WORKING, this is undefined
            });
        return promise;
    };

    private updateUser:(property:string, value:any) => void = (property, value) => {
    };
}

【问题讨论】:

  • 匿名函数中不是带有_this的打字稿匿名函数吗?我不确定了。我认为更可靠的方法可能是将其保存为本地变量,但通常打字稿应该为您进行此转换

标签: angularjs typescript promise


【解决方案1】:

问题是这一行:

.then((response:any):ng.IPromise<any> => this.handlerResponded(response, data))

虽然为了查找 handlerResponded 方法而维护了您的词法范围,但该范围并未完全保留在输出中。

您可以通过两种方式解决此问题:

  • 内联您的处理程序函数,而不是将其作为您的类中的函数
  • 你可以bind调用handlerResponded实例

绑定示例:

.then((response:any):ng.IPromise<any> => this.handlerResponded(response, data).bind(this))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 2013-05-18
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多