2016-08-19 5 views
1

Ich versuche, die canActivate Funktion gibt true oder false zurück.Angular 2 - Wert zwischen den Diensten senden

Der boolean Wert wird aus der Funktion signin() in Datei login.service.ts in response.json().message und erscheint true oder false scheint aber nicht den Wert, wenn ich this.loginService.logado() in canActivate Funktion in der Datei auth.guard.ts verwenden.

Wer weiß, wie man dieses Problem löst?

login.service.ts

import {Injectable} from "@angular/core"; 
import {Http, Headers} from "@angular/http"; 
import {Observable} from "rxjs/Observable"; 
import 'rxjs/Rx'; 
import {Config} from '../config'; 

@Injectable() 
export class LoginService{ 
    token: string; 
    userId: string; 
    constructor (private _http: Http) {} 

    login(contentLogin){ 
     const body = JSON.stringify(contentLogin); 
     const header = new Headers({'Content-Type': 'application/json'}); 
     return this._http.post(Config.URL_SITE + 'auth/login', body, {headers: header}) 
      .map(response => response.json()) 
      .catch(error => Observable.throw(error.json())); 
    } 

    signin() { 
     this.token = localStorage['token']; 
     this.userId = localStorage['userId']; 

     const body = JSON.stringify({token: this.token, userId: this.userId}); 
     const header = new Headers({'Content-Type': 'application/json'}); 
     return this._http.post(Config.URL_SITE + 'auth/signin', body, {headers: header}) 
      .map(response => response.json().message) //true or false 
      .catch(error => Observable.throw(error.json())); 
    } 
} 

auth.guard.ts

import {Injectable} from '@angular/core'; 
import {CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot} from '@angular/router'; 
import {Observable} from 'rxjs/Rx'; 
import {LoginService} from './login/login.service'; 

@Injectable() 
export class AuthGuard implements CanActivate { 
    constructor(private loginService: LoginService) {} 

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean { 
     return this.loginService.signin() 
    } 
} 
+0

Verwenden Sie das Rückgabeschlüsselwort '. map ((response) => {return response. Json(). message} ') ... – micronyks

+0

Hallo Micronyks, in der' canActivate' zeigt das Observable-Objekt, anstatt nur den Wert boolean – rafaelcb21

Antwort

1

Das ist ein bisschen eine seltsame Verhalten von canActivate aber es ist für die beobachtbaren warten zu vervollständigen statt nur für ein Ereignis des Observablen.

können Sie umgehen mit

return this.loginService.signin().first(); 

nicht die take Betreiber zu importieren Vergessen.

+0

Hi Gunter, füge ich ' importiere 'rxjs/add/operator/take'; 'aber benutze' console.log (this.loginService.logado(). take (1)) 'um zu sehen, wie der Wert der Funktion das Objekt Observable weiterdruckt – rafaelcb21

+0

Ich nehme' logado an 'ist die' signin' Methode im Code deiner Frage. Es wird erwartet, dass es "Observable" druckt. Nicht sicher, was Sie erwarten. Wenn Sie den Wert wünschen. Sie müssen subskribieren, dann wird der Wert an den Callback übergeben, den Sie an "subscribe (...)" übergeben. Das macht der Router mit dem Observable, der von 'canActivate' zurückgegeben wird - er abonniert es. (BTW Wenn Sie sich selbst abonnieren, erhalten Sie ein "Abonnement", das vom Router nicht verwendet werden kann). Sie können 'map (...)' verwenden, um auf den Wert zugreifen zu können, wenn der Router abonniert und ein Ereignis ausgegeben wird. –

+0

Ich erwarte in der 'auth.guard.ts' Datei in' canActivate' Funktion gibt wahr oder falsch zurück. Diesen Wert bekomme ich durch 'signin()' Funktion in 'login.service.ts' Datei. Die folgende Implementierung 'this.loginService.logado() .subscribe (data => {return data}, error => {return error.message})' erscheint 'true' in Data und' false' in Error, dies erscheint jedoch der folgende Fehler: canActivate die Funktion kann nicht 'void' aber' boolean' sein – rafaelcb21

Verwandte Themen