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