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

Javascript 延迟加载的模块可以使用根注入的canActivate保护吗?,javascript,angular,typescript,Javascript,Angular,Typescript,我有一个具有以下路径的应用程序: export const routes: Routes = [ { path: 'find', component: FindBookPageComponent }, { path: ':id', component: ViewBookPageComponent }, { path: '', component: CollectionPageComponent }, ]; 在同一个应用程序中,services文件夹中还有一个根注入的AuthGuar

我有一个具有以下路径的应用程序:

export const routes: Routes = [
  { path: 'find', component: FindBookPageComponent },
  { path: ':id', component: ViewBookPageComponent },
  { path: '', component: CollectionPageComponent },
];
在同一个应用程序中,
services
文件夹中还有一个根注入的
AuthGuard
服务。如果将该保护添加到books模块中的任何路由,则应用程序将永远旋转,并且不会启动

根注入的
CanActivate
guard是否可以在模块中使用,而无需在模块的
providers
数组中指定它

,所以我认为可以给警卫注射根

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

AuthGuard
依赖于一个
StateService
,如果它不能被根注入,那么我假设
StateService
也不能

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

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

根模块是由条目类型脚本文件中的
platformBrowserDynamic().bootstrapModule(module)
定义的模块(通常命名为
main.ts

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

听起来像是
AuthGaurd
返回了一个未完成的可观察值。尝试添加一个
返回observable.pipe(first())到保护功能

所有使用可观测的路由器功能(canActive、canLoad、resolve等)都要求完成可观测

我看过的文档显示,这些保护程序正在AppComponent提供商处注册,所以我认为根注入这些保护程序可以吗

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

AuthGuard依赖于StateService,如果它不能被根注入,那么我假设的StateService也不能

如果在注入器尝试实例化类时未声明提供程序,则会出现一个运行时错误,即构造函数具有未知的可注入器。这是一条类似以下内容的消息:构造函数(?)
,其中问号是未知参数


这意味着,如果以后将
StateService
定义为提供程序,则
AuthGaurd
将无法启动。这取决于何时首次使用
AuthGaurd
,因为它们是在首次使用之前才创建的。

您的所有评论都完全符合我的理解,我更改了guard实现,以便它导航到
login
,只返回
of(false)
。。。这样它肯定会回来。。。但应用程序仍然只是旋转。。。。所以也许Stackblitz被打破了。我会试着把它分解成很小的碎片,看看到底发生了什么。