我有一个angular 4.3.6应用程序,带有延迟加载的模块。这是一个部分根路由器:
const routes: Routes = [
{ path: '', redirectTo: 'fleet', pathMatch: 'full' },
{
path: '',
component: AppComponent,
canActivate: [AuthenticationGuard],
children: [
{
path: 'fleet',
loadChildren: "./modules/fleet.module",
canActivate: [AuthenticationGuard]
},
{
path: 'password/set',
loadChildren: "./modules/chooseNewPassword.module",
canActivate: [ChoosePasswordGuard]
}
]
}
]
// Exports RouterModule.forRoot(routes, { enableTracing: true });
舰队:
RouterModule.forChild([
{
path: '',
component: FleetComponent,
canActivate: [AuthenticationGuard]
}
]);
RouterModule.forChild([
{
path: '',
component: ChooseNewPasswordComponent,
canActivate: [ChoosePasswordGuard]
}
]);
< code>AuthenticationGuard调用如下所示的方法:
return this.getUserSession().map((userSession: UserSession) => {
if (userSession && userSession.ok) {
return true;
}
else if (userSession && userSession.expired) {
this.router.navigate(['password/set'])
.catch((e: Error) => console.error(e));
return true;
}
else {
window.location.replace('/');
return false;
}
}
因此,如果用户的会话正常,它将激活路由。如果用户的密码过期,它会将用户重定向到“选择新密码”模块。如果没有会话,则重定向到登录。
ChooseSPasswordGuard
做了类似的事情,但只保护choose new password组件(通常使用不同的功能设置密码):
return this.getUserSession().map((userSession: UserSession) => {
if (userSession) {
return userSession.expired;
}
else {
return false;
}
});
并且该循环重复。
(如果我用< code>return Observable.of(true)替换整个ChooseNewPasswordGuard也会重复);)
编辑:即使我在URL栏中提供了< code>/#/password/set,我也会被重定向到根页面(< code>/)...
问题:
> < li>
现在模块是延迟加载的,我在路由器或防护中做错了什么来强制此循环?我对< code>shouldActivate: true后跟< code > navigation cancel reason:" " 感到特别困惑。
我真的需要在我的子路由和根路由中重复激活
保护吗?
和往常一样,欢迎任何其他评论。
问题是我过度应用了< code>AuthenticationGuard:它不应该应用于顶级AppComponent,因为它总是会重定向到Choose New Password模块,即使它正在加载该模块。
我的根路由
应该如下所示:
const routes: Routes = [
{ path: '', redirectTo: 'fleet', pathMatch: 'full' },
{
path: '',
component: AppComponent,
// canActivate: [AuthenticationGuard], // <-- Remove this guard
children: [
{
path: 'fleet',
loadChildren: "./modules/fleet.module",
canActivate: [AuthenticationGuard]
},
{
path: 'password/set',
loadChildren: "./modules/chooseNewPassword.module",
canActivate: [ChoosePasswordGuard]
}
]
}
]
(我欢迎并乐意接受更好的解释或更好的身份验证保护模式。)
不确定我是否做对了一切。但问题是:当我从延迟加载的模块导航到组件的某些子路由时,它根本不加载。它从延迟加载模块重新加载主组件。 app-routing.component.ts planet-detector-routeting.module.ts 所以在上面的例子中,当你输入“http://localhost:4200/planet-detector/first”时,它会加载DetectorCo
为了显示这种关系,让我们开始定义一个简单的模块,作为我们的示例应用程序的根模块。 app/app.module.ts 到目前为止,这是一个非常常见的模块,依赖于,有一个路由机制和两个组件:AppComponent和EagerComponent。 现在,让我们专注于定义导航的应用程序(AppComponent)的根组件。 app/app.component.ts import { Component
我试图实现延迟加载,但得到如下错误** 错误错误:未捕获(在promise中):错误:BrowserModule已加载。如果您需要从一个延迟加载的模块中访问一些公共指令,比如NgIf和NgFor,那么可以导入CommonModule。 ** 需要帮助这是我的模块 共享模块 2.设置模块 5.AppModule
问题内容: 我试图在UI-Router router.js文件中延迟加载控制器和模板,但是在模板处理上遇到困难。 控制器已正确加载,但是在加载之后,我们必须加载模板,这就是问题所在。 ocLazyLoad加载控制器后,我们解析了一个Angular Promise,它也包含在templateProvider中。问题在于,在文件加载完成后,不是返回诺言(templateDeferred.promise
问题内容: 感谢Dan Wahlin的精彩文章,我设法实现了Angular的控制器和服务的延迟加载。但是,似乎没有一种干净的方法来懒惰加载独立的模块。 为了更好地解释我的问题,假设我有一个没有RequireJS的应用,其结构如下: 这是在Plunker中带有RequireJS的示例应用程序:http ://plnkr.co/aiarzVpMJchYPjFRrkwn 问题的核心是Angular不允许
我对这个(OSGI)真的是新手,试图做简单的例子。我不能让懒惰的修辞奏效。我知道有一些解决这些问题的蓝图,但在开始之前,我认为学习一些基础知识是很好的。 好吧,我已经改变了我的代码,但仍然没有运气。 外部应用程序,install bundles,启动framework,然后只启动DataServiceClient Bundle。不能访问任何bundle类。 以下是DataServiceClient