在 AngularJS 和 Typescript 的回调中使用$http this
Using 'this' in $http callback with AngularJS and Typescript
我在服务中使用了承诺,然后在结果加载时,我想导航到另一个页面。
我的代码:
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中。如何设置运行此函数的范围?我看到一个使用 var self = 这个的例子(无论如何我都不喜欢),但这不起作用。
感谢您的任何帮助。
它可能
不那么漂亮,但使用箭头函数表示法将正确保留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));
}
}
但是,您应该注意,目前使用 .bind()
会破坏 TypeScript 中的类型信息,因此我主要坚持使用箭头函数来正确保留类型信息。
相关文章:
- $(this).prop('property') vs. this.property
- Meteor如何接收HTTP请求
- Twitter Bootstrap typeahead:使用“this”获取上下文/调用元素
- 在另一个函数中使用变量this
- this.router在AngularJS 2中未定义
- 在我的情况下,如何进行http请求
- //而不是在src=“”上使用http://"属性
- reactjs this.refs vs document.getElementById
- JavaScript 中的嵌套函数和 “this” 关键字
- 我无法使用angularJs($http)访问服务器
- AJAX简单错误.XMLHttpRequest无法加载http://localhost/mpl/getPage.php.
- React+Meteor:this.ops返回未定义
- 如何将PHP get查询转换为Meteor's HTTP.get()
- 角度异步http自动完成
- 如何使用(this)访问Angular 2 http rxjs catch函数中的对象属性
- 如何绑定“;这个“;在$http.post中->在AngularJS中解析/拒绝?(现在this=Window对象
- 在 HTTP 错误回调中访问“this”
- 在 AngularJS 和 Typescript 的回调中使用$http this
- AngularJs——设置'this'对象在控制器中的$http调用
- "类型错误:this.options为null"在OpenLayers.Protocol.HTTP中