我是Angular 2的新手。过去我能够用文档解决所有出现的问题。但目前我对Angular 2使用的可观察模式存在很多问题,它带有rxjs。
我有以下工作流程。我实现了一个用户服务,它负责注册,登录,注销等基本步骤。此外,我还有一个标题组件,它将显示用户菜单。根据用户的登录信息,我想更新菜单(例如show logout或show login entries)。
为了实现这一点,我使用了rxjs-lib中的BehaviorSubject。基本上我只需要一个简单的布尔值,名为loggedIn,每次用户登录或注销时都会更新。这是服务,组件和模板的片段。
export class UsersService {
private _loggedIn: BehaviorSubject<boolean> = new BehaviorSubject(false);
public loggedIn: Observable<boolean> = this._loggedIn.asObservable();
constructor(private _router: Router, public http: Http, @Inject('ApiUrl') private apiUrl: string) {
let token = localStorage.getItem('token');
if (token) {
this._loggedIn.next(!this.jwtHelper.isTokenExpired(token));
}
}
public login(body): void {
this.http.post(this.apiUrl + '/login', body, { headers: contentHeaders })
.subscribe(
response => {
localStorage.setItem('token', response.json().token);
this._loggedIn.next(!this.jwtHelper.isTokenExpired(response.json().token));
this._router.navigateByUrl('');
},
error => {}
);
}
public logout(): void {
localStorage.removeItem('token');
this._loggedIn.next(false);
this._router.navigateByUrl('/login');
}
}
export class HeaderComponent {
loggedIn: boolean = false;
private _subscription: any;
constructor(private _users: UsersService) {
this._subscription = this._users.loggedIn.subscribe((value) => {
this.loggedIn = value;
});
}
当应用程序被引导时以及用户注销时,标题组件中的值会更新。问题是登录方法中的POST调用。似乎next()永远不会被调用。但回调中的其他内容如this._router.navigateByUrl(&#39;&#39;);虽然被称为。
我不确定我在这里做错了什么?我是否必须在回调中创建一个新的observable,或者登录本身是否会返回一个observable?
任何提示都表示赞赏! THX!
修改
stackoverflow很有趣。在我发表这个问题之后,我立即得到了其他问题的建议。但在我搜索之前,我找不到答案。问题是我多次注入服务,而不是仅仅在引导期间注入服务。
在此处找到解决方案:Issue with RxJs BehaviorSubject's subscriber not being notified of value change
尽管如此,这是一个合理的模式来通知更新组件吗?