我试图了解用户是否在我的Navbar组件中登录,因此我无法/禁用Navbar项目。我正在使用BehaviorSubject来组播数据。我的AuthenticationService包含BehaviorSubject对象,如下面的代码所示:
import {Injectable} from '@angular/core';
import {Http, RequestOptions, Headers} from '@angular/http';
import {LocalStorage, SessionStorage} from "angular2-localstorage/WebStorage";
import {BehaviorSubject} from 'rxjs/BehaviorSubject';
import {Credentials} from './credentials';
@Injectable()
export class AuthenticationService {
private _baseUrl="http://localhost:8080/webapi/authenticate/";
private loggedIn: boolean;
// Observable UserLoggedIn source
private _userLoggedInBehavior = new BehaviorSubject<boolean>(false);
// Observable UserLoggedIn stream
userLoggedInBehaviorStream = this._userLoggedInBehavior.asObservable();
constructor(private _http: Http){
this.loggedIn = localStorage.getItem("authToken");
}
authenticate(credentials: Credentials){
return this._http.post(
this._baseUrl
, JSON.stringify(credentials)
, this.getOptions()
)
.map(res => res.json())
.map((res) => {
if (res.success) {
sessionStorage.setItem("authToken", res.data.token);
this.loggedIn = true;
}
return res.success;
});
}
logout() {
sessionStorage.removeItem("authToken");
this.loggedIn = false;
}
isLoggedIn() {
return this.loggedIn;
}
changeUserLoggedInBehavior(loggedIn) {
this._userLoggedInBehavior.next(loggedIn);
}
// This was necessary because api accepts only JSON
// and if we do not put this header in requests API
// responds with 415 wrong media object.
getOptions(){
var jsonHeader = new Headers({
'Content-Type':'application/json'
});
var options = new RequestOptions({
headers: jsonHeader
});
return options;
}
}
触发代码的我的AuthenticationComponent代码如下所示:
import {Component, OnInit, EventEmitter} from '@angular/core';
import {CanDeactivate, Router} from '@angular/router-deprecated';
import {ControlGroup, Control, Validators, FormBuilder} from '@angular/common';
import {AuthenticationService} from './authentication.service';
import {Credentials} from './credentials';
import {EmailValidator} from '../../validators/email-validator';
@Component({
selector:'auth'
, templateUrl:'app/components/authentication/authentication.component.html'
, providers:[AuthenticationService]
})
export class AuthenticationComponent{
form: ControlGroup;
title: string = "LogIn";
credentials: Credentials = new Credentials();
constructor(
fb: FormBuilder
, private _authService: AuthenticationService
, private _router: Router){
this.form = fb.group({
emailId:[
''
, Validators.compose(
[
Validators.required
, EmailValidator.mustBeValidEmail
]
)
]
,password:[
''
, Validators.compose(
[
Validators.required
]
)
]
});
}
save(){
this._authService.authenticate (this.credentials)
.subscribe((result) => {
if (result) {
this._authService.changeUserLoggedInBehavior(true);
this._router.navigate(['Home']);
}
});
}
}
最后,我的NavbarComponent如下:
import {Component, OnInit, OnDestroy} from '@angular/core';
import {RouterLink} from '@angular/router-deprecated';
import {Subscription} from 'rxjs/Subscription';
import {AuthenticationService} from '../components/authentication/authentication.service';
@Component({
selector:'navbar'
, templateUrl: 'app/navbar/navbar.component.html'
, directives:[RouterLink]
, providers:[AuthenticationService]
})
export class NavbarComponent implements OnInit, OnDestroy{
private _isUserLoggedIn: boolean=false;
subscription: Subscription;
constructor(
private _authService: AuthenticationService
){}
ngOnInit(){
this.subscription = this._authService.userLoggedInBehaviorStream
.subscribe(
loggedIn => this._isUserLoggedIn = loggedIn
);
}
ngOnDestroy(){
// prevent memory leak when component is destroyed
this.subscription.unsubscribe();
}
public setUserLoggedId (isLoggedIn: boolean){
this._isUserLoggedIn = isLoggedIn;
}
}
我使用this as an example编写代码。请让我知道我哪里出错了。
答案 0 :(得分:5)
问题在于,您在两个组件中都指定了提供程序:
providers:[AuthenticationService]
每次在组件中提供一些服务,它都会获得新的实例。尝试在某些父组件中提供AuthenticationService,并注入子组件或引导级别。