我有一个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
吗?
答案 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
的时间,因为它们只有在第一次使用时才会创建。