angular - 除非在 Angular 6+ 中刷新,否则不会渲染组件
问题描述
身份验证后,应用程序将重定向到仪表板。此仪表板有一个侧边栏,所有路由器链接都会更改地址栏中的路径名,但不会呈现组件,除非手动重新加载页面。
这是我的主要app.component.html
代码:
<div *ngIf="isLogged" class="dashboard">
<app-navbar></app-navbar>
<div class="container-fluid">
<div class="row navbar-expand-md">
<app-sidebar></app-sidebar>
<main role="main" class="col-md-9 ml-sm-auto col-lg-10 pt-3 px-4">
<div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pb-2 mb-3 border-bottom">
<h1 class="h2">Dashboard</h1>
</div>
<router-outlet></router-outlet>
</main>
</div>
</div>
</div>
<div *ngIf="!isLogged" class="plain-page">
<router-outlet></router-outlet>
</div>
这是app.component.ts
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { AuthguardService } from './services/authguard.service';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit{
title = 'App';
isLogged: boolean = false;
constructor (
private router: Router,
private authguardService: AuthguardService
){}
ngOnInit(){
// this.isLogged = this.authguardService.canActivate();
this.authguardService.authStatus.subscribe(
(data: boolean) => {
this.isLogged = data;
}
);
}
}
现在这是我的router.module
import { NgModule } from '@angular/core';
import { RouterModule, Routes, CanActivate } from '@angular/router';
import { AuthguardService as Authguard } from './services/authguard.service';
import { LoginComponent } from './pages/login/login.component';
import { SignupComponent } from './pages/signup/signup.component';
import { UsersComponent } from './pages/users/users.component';
import { DashboardComponent } from './pages/dashboard/dashboard.component';
import { Google2FAComponent } from './pages/google2-fa/google2-fa.component';
import { RolesComponent } from './pages/roles/roles.component';
import { FileUploadComponent } from './pages/merchant/file-upload/file-upload.component';
const appRoutes: Routes = [
{
path: 'login',
component: LoginComponent
},
{
path: 'signup',
component: SignupComponent
},
{
path: '',
redirectTo: 'dashboard',
pathMatch: 'full'
},
{
path: 'google2fa/:id',
component: Google2FAComponent,
canActivate: [Authguard]
},
{
path: 'dashboard',
component: DashboardComponent,
canActivate: [Authguard]
},
{
path: 'users',
component: UsersComponent,
canActivate: [Authguard]
},
{
path: 'roles',
component: RolesComponent,
canActivate: [Authguard]
},
{
path: 'file-upload',
component: FileUploadComponent,
canActivate: [Authguard]
}
]
@NgModule({
declarations: [],
imports: [
RouterModule.forRoot(appRoutes, {onSameUrlNavigation: 'reload'})
],
exports: [RouterModule]
})
export class RoutesModule { }
这是AuthguardService
import { Injectable } from '@angular/core';
import { Router, CanActivate } from '@angular/router';
import { TokenService } from './token.service';
import { BehaviorSubject } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class AuthguardService implements CanActivate {
private isLoggedIn = new BehaviorSubject<boolean>(this.tokenService.loggedIn());
authStatus = this.isLoggedIn.asObservable()
constructor(
private router: Router,
private tokenService: TokenService
) {}
canActivate(): boolean {
if (!this.tokenService.loggedIn()) {
this.router.navigate(['login']);
return false;
}
return true;
}
changeAuthStatus(value: boolean){
this.isLoggedIn.next(value);
}
}
为什么登录后组件没有渲染并且需要手动重新加载才能渲染它的问题是什么?
解决方案
我认为这里的问题可能是由于 Angular 组件生命周期,订阅永远不会解决,因为组件一开始没有显示,请在构造函数中包含以下内容:
export class AppComponent implements OnInit{
title = 'App';
isLogged: boolean = false;
constructor (
private router: Router,
private authguardService: AuthguardService
){
this.authguardService.authStatus.subscribe(
(data: boolean) => {
this.isLogged = data;
}
}
// remove the subscribe from the ngOnInit()
推荐阅读
- bpmn - 如何使用 BPMN 创建用户流程图?
- python - 无法在 sqlalchemy 中引用外键引用
- amazon-web-services - AWS 代码构建引发错误“CLIENT_ERROR:未找到主要源和源版本的参考增量”
- zend-framework3 - 如何在 ZF3 中初始化模块(用户)?
- vba - 如何在 Visio 中为批量“适合绘图”操作编写宏?
- android - 两个生产者一个表面
- xml - 为小部件 Magento2 插入新容器选项
- vue.js - 对 Vee-Validate 使用 v-model 而不是 name 属性
- javascript - 通过 cy.request 在 mailcatcher 中获取电子邮件
- facebook - Facebook分享更改域名