使用'这个'在$ http回调中使用AngularJS和Typescript

时间:2015-01-18 11:54:20

标签: javascript angularjs typescript

我在服务中使用promise,然后在结果加载时我想导航到另一个页面。

我的代码:

export class PicasaAuthenticator
{
    //  Constructor

    static $inject = [ '$window', '$location', '$http' ];
    constructor( private window : ng.IWindowService, private location : ng.ILocationService, private http : ng.IHttpService )
    {
    }

    //  Private Functions

    private validateToken( results : IAuthResults ) : void
    {
        if( results && results.access_token )
        {
            var validateTokenURL : string = "https://www.googleapis.com/oauth2/v1/tokeninfo";
            validateTokenURL += "?access_token=" + results.access_token;

            this.http.get<ITokenValidationResult>( validateTokenURL );
            this._validationPromise.then( this.handleTokenVerificationResult,this.handleTokenVerificationError );
        }
    }

    private handleTokenVerificationResult( successResponse : ng.IHttpPromiseCallbackArg<ITokenValidationResult> ) : void
    {
        this._validationPromise = null;

        if( successResponse.data.audience = client_id )
        {
            this.location.path( '/albums' );
        }
        else
        {
            alert( "audience does not match client ID" );
        }
    }
}

问题是handleTokenVerificationResult中不存在this.location。如何设置此功能应在其下运行的范围?我看到了一个使用var self = this的例子(我不喜欢它),但这不起作用。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

它可能不是很漂亮,但使用箭头函数表示法会正确保留this值,因此我会尝试将validateToken()函数更改为以下内容:

private validateToken( results : IAuthResults ) : void
{
    if( results && results.access_token )
    {
        var validateTokenURL : string = "https://www.googleapis.com/oauth2/v1/tokeninfo";
        validateTokenURL += "?access_token=" + results.access_token;

        this.http.get<ITokenValidationResult>( validateTokenURL );
        this._validationPromise.then( () => {
            this.handleTokenVerificationResult.apply(this, arguments); 
        }, () => { 
            this.handleTokenVerificationError.apply(this, arguments); 
        });
    }
}

或者,只需使用Function.bind()来保留this变量的值:

private validateToken( results : IAuthResults ) : void
{
    if( results && results.access_token )
    {
        var validateTokenURL : string = "https://www.googleapis.com/oauth2/v1/tokeninfo";
        validateTokenURL += "?access_token=" + results.access_token;

        this.http.get<ITokenValidationResult>( validateTokenURL );
        this._validationPromise.then(this.handleTokenVerificationResult.bind(this), this.handleTokenVerificationError.bind(this));
    }
}

但是,您应该注意目前在TypeScript中使用.bind() destroys type information,所以我主要使用箭头功能来正确保存类型信息。

相关问题