【发布时间】:2019-03-19 22:34:06
【问题描述】:
在模板组件AppComponent中,变量this.loggedInService.isLoggedIn根据值在logIn()和logout()方法之间切换,在应用程序组件AppComponent中是subscribed到这些方法中服务LoggedinService并根据方法,将变量的值更改为true或false。
同样在 Guard 的方法 checkLogin (url: string) 中,我根据变量 this.loggedInService.isLoggedIn 的值返回 true 或 false。
启动应用时无法进入模块,点击按钮时可以,但重复点击“退出”按钮时,仍然可以进入模块。强>
如何使切换到checkLogin工作,使身份验证正常工作,并保存页面重新启动时在输入和输出之间切换状态的值?
**AppComponent.html: **
<li class="nav-item">
<a class="btn btn-outline-success"
[class.btn-outline-success]="!this.loggedInService.isLoggedIn$"
[class.btn-outline-danger]="this.loggedInService.isLoggedIn$"
(click)="this.loggedInService.isLoggedIn$ ? logout() : logIn()">
{{this.loggedInService.isLoggedIn$ ? 'Exit' : 'Enter'}}
</a>
</li>
**AppComponent.ts **
导出类 AppComponent 实现 OnInit { 消息:字符串;
constructor(public loggedInService: LoggedinService,
public router: Router) {
this.setMessage();
}
ngOnInit() {}
logIn(): void {
this.loggedInService.login().subscribe(() => {
if (this.loggedInService.isLoggedIn$) {
let redirect = this.loggedInService.redirectUrl ? this.loggedInService.redirectUrl :
'/gallery';
this.router.navigate([redirect]);
}
});
}
logout(): void {
this.loggedInService.logout();
}
}
登录服务:
export class LoggedinService {
isLoggedIn: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
isLoggedIn$: Observable<boolean> = this.isLoggedIn.asObservable();
redirectUrl: string;
constructor() {}
login(): Observable < boolean > {
return of(true).pipe(
delay(100),
tap(val => this.isLoggedIn.next(true))
);
}
logout(): void {
this.isLoggedIn.next(false);
}
}
AuthGuard:
export class AuthGuard implements CanActivate {
constructor(
private loggedInService: LoggedinService,
private router: Router
) {}
canActivate(next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> {
let url: string = state.url;
return this.loggedInService.isLoggedIn$;
}
checkLogin(url: string): boolean {
if (this.loggedInService.isLoggedIn) {
return true;
} else {
this.loggedInService.redirectUrl = url;
return false;
}
}
}
【问题讨论】:
-
整个应用程序中是否只有一个服务实例?简而言之,您是否将
LoggedinService添加到您的主模块的提供程序中并且没有在组件提供程序中包含该服务?否则会创建多个服务实例。 -
我有两个服务用于整个应用程序,它们连接到“providers”中的“app.module”
标签: javascript html angular typescript angular6