Service 角度2-服务之间的发送值

Service 角度2-服务之间的发送值,service,angular,observable,Service,Angular,Observable,我试图使canActivate函数返回true或false 布尔值将来自文件login.service.ts 在response.json().message中显示true或false但在文件auth.guard.ts中使用this.loginService.logado()时不显示值 有人知道如何解决这个问题吗 login.service.ts import {Injectable} from "@angular/core"; import {Http, Headers} from "@ang

我试图使
canActivate
函数返回
true
false

布尔值将来自文件
login.service.ts
response.json().message
中显示
true
false
但在
文件
auth.guard.ts
中使用
this.loginService.logado()
时不显示值

有人知道如何解决这个问题吗

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()));
    }
}
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()
    }
}
auth.guard.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()));
    }
}
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()
    }
}
从'@angular/core'导入{Injectable};
从'@angular/router'导入{CanActivate,ActivatedRouteSnapshot,RouterStateSnashot};
从'rxjs/Rx'导入{Observable};
从“./login/login.service”导入{LoginService};
@可注射()
导出类AuthGuard实现了CanActivate{
构造函数(私有登录服务:登录服务){}
canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察的布尔值{
返回此.loginService.signin()
}
}

这是一个有点奇怪的行为,
canActivate
,但它确实会等待可观察对象完成,而不仅仅是等待可观察对象的事件

您可以使用

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

不要忘记导入
take
操作符。

使用return关键字
。map((response)=>{return response.Json().message}
)…Hi Micronyks,在
canActivate
中不断显示可观察的对象,而不仅仅是booleanHi-Gunter值,我添加
导入'rxjs/add/operator/take'
但使用
console.log(this.loginService.logado().take(1))
查看函数值继续打印可观察对象我假设
logado
是问题代码中的
signin
方法。预计它将打印
可观察的
。不知道你期望什么。如果你想要这个值。您需要订阅,然后将值传递给传递给
subscribe(…)
的回调。这是路由器对
canActivate
返回的可观察对象所做的操作-它订阅它。(顺便说一句,如果您自己订阅,您将获得路由器无法使用的
订阅。您可以使用
map(…)
在路由器订阅并发出事件时访问该值。我希望
canActivate
函数中的
auth.guard.ts
文件返回true或false。我通过
login.service.ts
文件中的
signin()
函数获取该值。但是,以下实现
this.loginService.logado().subscribe(数据=>{return data},错误=>{return error.message})
在数据中显示
true
,在错误中显示
false
,这出现了以下错误:canActivate函数不能是
void
,但
boolean
您无法从可观察对象返回
true'或
false'
CanActivate
与发出
true
false
值的
Observable
一起工作正常。唯一的问题是,当它收到第一个值时,它不会继续,而是等待可观察对象关闭。这就是
take(1)
要处理的。因此,我的答案中的代码应该满足您的要求成功了。这些页面受到保护。控制台上出现以下错误:
error:Uncaught(承诺中):false