Angular 为什么在用户登录和注销时未更新标头模板中可观察到的isLoggedIn?
MyAngular 为什么在用户登录和注销时未更新标头模板中可观察到的isLoggedIn?,angular,observable,Angular,Observable,MyAppModule导入一个CoreModule @NgModule({ providers: [ LoginService ], }) export class CoreModule { 它本身在全球范围内提供登录服务 @Injectable() export class LoginService { constructor( private router: Router, private authService: AuthServ
AppModule
导入一个CoreModule
@NgModule({
providers: [
LoginService
],
})
export class CoreModule {
它本身在全球范围内提供登录服务
@Injectable()
export class LoginService {
constructor(
private router: Router,
private authService: AuthService
) { }
login(username: string, password: string) {
this.authService.login(username, password).subscribe(
response => {
this.router.navigate(['users']); // TODO Check that all router.navigate don't use hard coded strings
},
error => {
console.log(error);
}
);
}
logout() {
this.authService.logout().subscribe(
response => {
this.router.navigate(['login']);
},
error => {
console.log(error);
}
);
}
}
还有一个AuthService
,用于服务器端登录或注销,并将登录状态保存在浏览器本地存储中
public isAuthenticated(): Observable<boolean> {
if (this.tokenService.accessTokenExpired()) {
if (this.tokenService.refreshTokenExpired()) {
return of(false);
} else {
return this.refreshAccessToken()
.pipe(
map(response => {
if (response) {
return true;
}
}),
catchError((error, caught) => {
return of(false);
})
);
}
}
return of(true);
}
登录
布局:
@Component({
selector: 'app-login-layout',
template: `<router-outlet></router-outlet>`
})
export class LoginLayoutComponent { }
@Component({
selector: 'app-home-layout',
templateUrl: './home.layout.component.html'
})
export class HomeLayoutComponent { }
使用其模板:
<mat-sidenav-container class="example-container">
<mat-sidenav #drawer mode="side" opened role="navigation">
<mat-nav-list>
<a mat-list-item routerLink='/first'>First Component</a>
<a mat-list-item routerLink='/second'>Second Component</a>
</mat-nav-list>
</mat-sidenav>
<mat-sidenav-content>
<app-header></app-header>
</mat-sidenav-content>
<router-outlet></router-outlet>
</mat-sidenav-container>
第一部分
第二部分
我发现的身份验证存在问题。每次它总是返回新的可观察的。您应该有一个可观察的
,通过它可以通知所有订阅
授权服务
注意:我没有涵盖代币,但你可以用你现在的方式处理它
订阅$isLoggedIn并检查您是否能够在ts文件中获取通知。isAuthenticated
方法发送http?或者它是一个主题
?@Nour我在问题中添加了方法源代码。@SunilSingh我应该在哪个方法中使用subscribe实现?似乎您有变更检测
问题,我猜angular在注销
调用后没有得到更改,所以异步管道确实被调用了。尝试在isAuthenticated
方法中添加控制台日志。并检查它是否被调用。您在此处看到多个可观察对象吗?在isAuthenticated()
-中返回(false)代码>其他地方也一样。每次它都会创建新的可观察对象。如果不使用(false)的任何,您将如何对此进行编码
then?this.authSubject.next(false)
很抱歉,这个返回这个.authSubject.next(false)//(假)代码>已停止编译。什么是authSubject
变量?
@Component({
selector: 'app-login-layout',
template: `<router-outlet></router-outlet>`
})
export class LoginLayoutComponent { }
@Component({
selector: 'app-home-layout',
templateUrl: './home.layout.component.html'
})
export class HomeLayoutComponent { }
<mat-sidenav-container class="example-container">
<mat-sidenav #drawer mode="side" opened role="navigation">
<mat-nav-list>
<a mat-list-item routerLink='/first'>First Component</a>
<a mat-list-item routerLink='/second'>Second Component</a>
</mat-nav-list>
</mat-sidenav>
<mat-sidenav-content>
<app-header></app-header>
</mat-sidenav-content>
<router-outlet></router-outlet>
</mat-sidenav-container>
private authSubject = new BehaviorSubject<boolean>(false);
private isLoggedIn$ = this.authSubject.asObservable();
updateLoggedInState(status: boolean){
this.authSubject.next(status);
}
public isAuthenticated(): Observable<boolean> {
return this.isLoggedIn$;
}
@Injectable()
export class LoginService {
constructor(
private router: Router,
private authService: AuthService
) { }
login(username: string, password: string) {
this.authService.login(username, password).subscribe(
response => {
this.router.navigate(['users']); // TODO Check that all router.navigate don't use hard coded strings
this.authService.updateLoggedInState(true);
},
error => {
console.log(error);
this.authService.updateLoggedInState(false);
}
);
}
logout() {
this.authService.logout().subscribe(
response => {
this.router.navigate(['login']);
this.authService.updateLoggedInState(false);
},
error => {
console.log(error);
}
);
}
}