延迟加载的模块可以使用注入根的canActivate保护吗?

时间:2019-01-03 01:25:12

标签: javascript angular typescript

我有一个stackblitz books module,具有以下路径:

export const routes: Routes = [
  { path: 'find', component: FindBookPageComponent },
  { path: ':id', component: ViewBookPageComponent },
  { path: '', component: CollectionPageComponent },
];

在同一应用程序中,还存在AuthGuard文件夹中的根注入services服务。如果将该防护措施添加到books模块中的任何路由中,该应用程序将永远旋转,并且不会启动。

是否可以在模块的CanActivate数组中未指定根注入的providers保护对象?

The documentation I have looked at show the guards being registered with the AppComponent providers,所以我认为可以根植守卫吗?

如果必须指定,是否仍可以进行根注入?

AuthGuard依赖于StateService,如果无法进行根注入,那么我也不能假设StateService吗?

1 个答案:

答案 0 :(得分:1)

  

是否可以在模块中使用根注入的CanActivate Guard而不在模块的providers数组中指定它?

技术上已经指定了它。 @Injectable({provideIn: 'root'})告诉Angular编译器将其添加到主模块的提供程序列表中。这只是Angular的一项便利功能。

根模块是由platformBrowserDynamic().bootstrapModule(module)在条目TypeScript文件中定义的模块(通常命名为main.ts)。

  

如果将该防护措施添加到books模块中的任何路由中,则该应用程序将永远旋转,并且不会启动。

类似AuthGaurd的声音返回的声音未完成。尝试将return observable.pipe(first());添加到保护功能。

使用可观察对象的所有路由器功能(canActive,canLoad,resolve等)都要求可观察对象完整。

  

我查看的文档显示了在AppComponent提供程序中注册的防护,因此我认为可以根注入防护吗?

在这种情况下,该模块与声明根路由的模块相同。您可以看到RouterModule.forRoot(appRoutes)用于导入具有顶级路由的路由器。因此,路由器将可以看到提供商在此级别定义的任何内容,因为它们共享同一个注射器。

  

AuthGuard依赖于StateService,如果无法进行根注入,那么我也不能假定StateService吗?

如果在注入器尝试实例化类时未声明提供程序,则您会收到运行时错误,表明构造函数具有未知的注入器。这是一条类似error: constructor(?)的消息,其中问号是未知参数。

这意味着,如果以后将StateService定义为提供者,那么AuthGaurd将会无法启动。这取决于首先使用AuthGaurd的时间,因为它们只有在第一次使用时才会创建。