2015-01-18 14 views
1

서비스에서 약속을 사용하고 결과가로드되면 다른 페이지로 이동하려고합니다.

내 코드 :

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"); 
     } 
    } 
} 

문제는 물론 this.location이 handleTokenVerificationResult에 존재하지 않는다는 것입니다. 이 함수를 실행할 범위를 어떻게 설정합니까? 나는 var self = this를 사용하는 예를 보았지만 (나는 어쨌든 좋아하지 않는다), 그러나 이것은 효과가 없었다.

도움 주셔서 감사합니다.

+0

대신 this.window.location의 window.location을 시도하십시오. –

답변

2

그것은 같은 꽤 수 있지만 제대로 this 값을 유지합니다 화살표 기능 표기법을 사용하여, 그래서 다음에 validateToken() 기능을 변경하려고 할 것입니다하지 않을 수 있습니다 단지 보존 Function.bind()를 사용

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); 
     }); 
    } 
} 

을 대안으로 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()destroys type information를 사용하여 t, 현재, 나는 주로 타입 정보를 올바르게 보존하기 위해 화살표 함수를 사용한다.

+0

많은 감사합니다. 바인드 접근 방식을 사용했습니다. 무슨 일이 일어나고 있는지 쉽게 이해할 수 있습니다. – Roaders

관련 문제