Angular 延迟加载模块的路由完全重新加载应用程序

Angular 延迟加载模块的路由完全重新加载应用程序,angular,ngrx,ngrx-store,Angular,Ngrx,Ngrx Store,我的路线是这样设置的 const routes: Routes = [ { path: '', redirectTo: '/', pathMatch: 'full' }, { path: 'bank-manager', loadChildren: () => import('./bank-manager/bank-manager.module').then(m => m.BankManagerModule), canActivate: [AuthGuard] }, { path:

我的路线是这样设置的

const routes: Routes = [
{
path: '',
redirectTo: '/',
pathMatch: 'full'
},
{
path: 'bank-manager',
loadChildren: () => import('./bank-manager/bank-manager.module').then(m => m.BankManagerModule),
canActivate: [AuthGuard]
},
 {
path: 'account-holder',
loadChildren: () => import('./account-holder/account-holder.module').then(m => 
 m.AccountHolderModule),
canActivate: [AuthGuard]
   },
    {
   path: '**',
   redirectTo: ''
 }
 ];
我有一个登录按钮,它连接到一个ngrx商店,商店工作正常。当我登录时,商店中会设置所需的值。我希望用户如果没有登录,就不能转到子路由。所以我有一个像这样的authGuard

    @Injectable()
export class AuthGuard implements CanActivate {
constructor(private store: Store<AppState>, private router: Router) {}

canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
): Observable<boolean> {
    return this.store.pipe(
    select(isLoggedInSelector),
    tap((loggedIn) => {
        if (!loggedIn) {
            this.router.navigateByUrl('/');
        }
    })
    );
}
}
因此,我转到localhost:4200,然后单击login,这将根据需要更改存储。但是当我手动转到 localhost:4200/帐户持有人它重新加载整个应用程序,并且商店值丢失


我做错了什么

在所有情况下都尝试返回true/false

@注射的{ providedIn:'根', } 导出类AuthGuard实现了CanActivate{ 建造师 受保护的只读路由器:路由器, 受保护的只读存储:存储, {} 公共活动:可观察{ 归还这个.store.pipe 选择IsLoggeDinSelector, 不同的是, switchMapflag=>{ 如果旗{ 回滞; } 从此.router.navigate['/'].pipemapTofalse返回; }, ; } }
如果你的意思是手动-你把url放在你的浏览器中,然后打开你的angular应用程序的新副本-它将不起作用。存储将数据保存在内存中,您需要一个辅助解决方案使其持久化,例如,您可以使用,然后每次打开应用程序时,它都将从本地存储还原存储。

在所有情况下都尝试返回true/false

@注射的{ providedIn:'根', } 导出类AuthGuard实现了CanActivate{ 建造师 受保护的只读路由器:路由器, 受保护的只读存储:存储, {} 公共活动:可观察{ 归还这个.store.pipe 选择IsLoggeDinSelector, 不同的是, switchMapflag=>{ 如果旗{ 回滞; } 从此.router.navigate['/'].pipemapTofalse返回; }, ; } }
如果你的意思是手动-你把url放在你的浏览器中,然后打开你的angular应用程序的新副本-它将不起作用。存储将数据保存在内存中,您需要一个辅助解决方案使其持久化,例如,您可以使用,然后每次打开应用程序时,它都会从本地存储还原存储。

除了您的问题之外,对于延迟加载的模块,您应该使用canLoad route guard。如果canActivate返回false,模块将被加载,这可能是不需要的。canLoad可确保,如果防护失败,则根本不会加载模块。除了您的问题之外,对于延迟加载的模块,您应该使用canLoad路由防护。如果canActivate返回false,模块将被加载,这可能是不需要的。canLoad可确保,如果防护失败,则根本不会加载模块。谢谢,我实现了本地存储,现在有意义了。谢谢,我实现了本地存储,现在有意义了。