Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 解决由APP_初始值设定项引起的循环依赖_Angular_Typescript_Angular Services - Fatal编程技术网

Angular 解决由APP_初始值设定项引起的循环依赖

Angular 解决由APP_初始值设定项引起的循环依赖,angular,typescript,angular-services,Angular,Typescript,Angular Services,我有一个服务AuthenticationService加载AngularFirestore。服务加载到RootComponent中。所有应用程序模块都延迟加载到RootComponent(它有主路由器出口)。现在有许多子模块也加载AngularFirestore 在加载组件和模块之前,我必须确保AuthenticationService已初始化(异步),因此我已将其放入APP\u INITIALIZERprovider中。这导致循环依赖性无法实例化循环依赖性!AngularFirestore 如

我有一个服务
AuthenticationService
加载
AngularFirestore
。服务加载到
RootComponent
中。所有应用程序模块都延迟加载到
RootComponent
(它有主
路由器出口
)。现在有许多子模块也加载
AngularFirestore

在加载组件和模块之前,我必须确保
AuthenticationService
已初始化(异步),因此我已将其放入
APP\u INITIALIZER
provider中。这导致循环依赖性
无法实例化循环依赖性!AngularFirestore

如果我没有将其放入
APP\u INITIALIZER
中,它可以工作,但应用程序在未初始化
AuthenticationService
的情况下运行

有办法解决这个问题吗?(除了在所有组件中添加
auth.initialize()

应用程序树:

AppComponent -> RootComponent(AuthenticationService) -> All Submodules(AuthenticationService, AngularFirestore)
//AuthenticationService的构造函数
建造师(
私人授权:AngularFireAuth,
私有远程配置:AngularFireRemoteConfig,
私人keepalive:keepalive,
私人闲置:闲置,
私人祝酒:祝酒服务,
专用路由器:路由器,
私人财政司司长:AngularFirestore,
私有http:HttpClient,
)
//app.module.ts中的提供程序
{
提供:应用程序初始化器,
多:是的,
useFactory:authFactory,
副署长:[
认证服务
]
}
//APP\u初始值设定项的工厂
导出函数authFactory(
auth:AuthenticationService
) {
return():Promise=>auth.initialize();
}

问候

所以在浏览了大量github评论和无关的So问题之后,我想出了一个解决方案,我在github评论中略过了一个无关的问题

TLDR:通过为
AngularFirestore
创建新服务进行注入,仅针对
AuthenticationService
或整个应用程序。我和后者一起去的

了解问题:

AppComponent -> RootComponent(AuthenticationService) -> All Submodules(AuthenticationService, AngularFirestore)
据我所知,问题是因为我的
AuthenticationService
加载
AngularFirestore
,并使其成为其依赖关系树的一部分。现在,
AuthenticationService
AngularFirestore
的任何后续注入都会产生循环依赖,因为注入
AuthenticationService
会使
AngularFirestore
成为依赖树的一部分,当我注入
AngularFirestore
之后,它会创建两次
AngularFirestore
注入。因此出现了错误。我可能完全错了,但我认为这就是问题所在

解决方案:

AppComponent -> RootComponent(AuthenticationService) -> All Submodules(AuthenticationService, AngularFirestore)
AngularFirestore
导入创建服务。我认为,这会将其从依赖关系树中移出,并将其作为一项服务注入,使其可以用于后续的
AngularFirestore
safe注入

//appfirestoreservice.ts
从“@angular/core”导入{Injectable};
从'@angular/fire/firestore'导入{AngularFirestore};
@注射的({
providedIn:'根'
})
导出类AppFirestoreService{
公共财政司司长:AngularFirestore;
public readonly collection=this.\u fs.collection;
public readonly doc=this.\u fs.doc;
public readonly createId=this.\u fs.createId;
建造师(
私人:AngularFirestore,
) {
this.fs=_fs;
}
}
//AppModule中的App初始值设定项
{
提供:应用程序初始化器,
多:是的,
useFactory:initFactory,
副署长:[
AppServiceInitializerService,
远程配置服务,
认证服务,
]
},
对于我的情况,我必须创建一个服务来加载
RemoteConfigService
AuthenticationService
,因为它们必须一个接一个地初始化


问候

没有详细检查您的用例,但这通常是因为HTTP拦截器。请参阅。@LazarLjubenović很遗憾,我没有使用任何HTTP拦截器。谢谢你的意见!