2016-07-14 4 views
0

Ich benutze den folgenden Code-Wert von this werden null, wenn ich es innerhalb der then Funktion nennen hier ist der Code. Bin ich falsch, etwas zu tun oder ist es so oder gibt es um eine Arbeit dieses ProblemWert wird null in Promise Rückruf

import { Injectable }  from '@angular/core'; 
import { Http, Response } from '@angular/http'; 
import { Headers, RequestOptions } from '@angular/http'; 

import { Observable }  from 'rxjs/Observable'; 
import { CanActivate, Router } from '@angular/router'; 

import { AuthService }   from '../services/auth.service'; 
import { WebAPISettings }   from '../services/webapisettings.service'; 

@Injectable() 
export class LoginService { 

    //_ngWEBAPISettings: WebAPISettings; 
    //_authService: AuthService; 

    constructor(private http: Http, private ngWEBAPISettings: WebAPISettings, private authService: AuthService) { 
    //this._ngWEBAPISettings = ngWEBAPISettings; 
    //this._authService = authService; 
    } 

    public login(username: string, password: string): Promise<any> { 

    let data = "grant_type=password&username=" + username + "&password=" + password; 
    let headers = new Headers({ 'Content-Type': 'application/x-www-form-urlencoded' }); 
    let options = new RequestOptions({ headers: headers }); 


    try { 
     debugger; 
     return this.http.post(this.ngWEBAPISettings.apiServiceBaseUri + "token", data, options) 
     .toPromise() 
     .then(function (res: Response) { 
      debugger; 
      let body = res.json(); 
      //let _authService: AuthService = new AuthService(); 

      this.authService.fillAuthDataFromLogin(body); 
      //this.router.navigate(['/Home']); 
      return body.data || {}; 
     }) 
     .catch(this.handleError); 

    } 
    catch (error) { 
     console.log(error); 

    } 

    } 


    private extractData() { 

    } 
    private handleError(error: any) { 
    debugger; 
    let errMsg = (error.message) ? error.message : 
     error.status ? `${error.status} - ${error.statusText}` : 'Server error'; 
    console.error(errMsg); // log to console instead 
    return Observable.throw(errMsg); 
    } 


} 

zu lösen und ich es hier im Chrom bin Debuggen ist der Screenshot mir bitte es bei der Festsetzung helfen.

enter image description here

nach der Pfeil Funktion elbe überprüfen Sie den Bildschirm

Schuss mit

enter image description here

einer Sache zu erwähnen i Angular2 RC4 verwenden.

+0

Pfeil Funktionen: https://basarat.gitbooks.io/typescript/content/docs/arrow-functions.html – basarat

Antwort

2

Sie könnten einen Pfeil Funktion nutzen zu können verwenden diese die lexikalische verwenden:

return this.http.post(this.ngWEBAPISettings.apiServiceBaseUri + "token", data, options) 
    .toPromise() 
    .then((res: Response) => { // <----- 
     (...) 
    }); 

Auf diese Weise this auf die Instanz des LoginService Service entspricht.

Sehen Sie dieses Dokument für weitere Informationen:

+0

Check letzten screenshot in der Frage kein Glück :( – rashfmnb

+2

Das ist ein Problem mit dev tools .. Sie erhalten den richtigen Wert, wenn Sie es an der Konsole anmelden. Grund: Devtools zeigt Ihnen ts-Code, aber tatsächlich läuft Javascript-Code (es5) , das ist immer noch "null" anstelle einer Instanz Ihrer Klasse. – wzr1337

+0

Nein t so offensichtlich! Ich bin nicht sicher, den Grund zu verstehen ;-) –