最近想应用一个service的时候报了循环依赖的问题。
官网领导给的调用办法很简略,在构造函数中增加notifyService
,而后间接调用即可。
export class ThyNotifyBasicExampleComponent implements OnInit { constructor(private notifyService: ThyNotifyService) {} ngOnInit() {} showDefault() { this.notifyService.show({ title: '增加我的项目胜利!' }); }}
然而我在应用的时候却报了notifyService
的循环依赖。NG0200: Circular dependency in DI detected for ThyNotifyService
如图
尝试解决:
上谷歌搜寻后,最开始尝试了这种办法: 构造函数里结构的是Injector,
接着在函数给定义的属性赋值。
private payrollService:PayrollService;constructor(injector:Injector) { setTimeout(() => this.payrollService = injector.get(PayrollService));}
在 Angular 中 Injector (注入器) 用来治理服务对象的创立和获取,
Injector 抽象类中定义了一个 get()
形象办法,该办法用于依据给定的 Token 从注入器中获取相应的对象,每个Injector 抽象类的子类都必须实现该办法。
尽管不晓得为什么他说这样做能够解决循环依赖问题,然而通过我尝试之后,很显著没有用。
Provide:
之后想起了之前我的项目中,解决formControl组件循环依赖个别通过providers。
providers: [ { provide: NG_VALUE_ACCESSOR, multi: true, useExisting: forwardRef(() => { return VehicleColourSelectComponent; }) } ]
发现自己忽然对provide注入忘得差不多了。于是大略讲一下
AngularJS文档对provider的定义:
provider是一个带有$get()办法的对象。injector调用$get办法创立一个新的service
在Angular中有很多形式能够将服务类注册到注入器中:
@Injectable
中的providedIn
属性@NgModule
中的providers
属性@Component
中的providers
属性
- @Injectable 中的providedIn属性
@Injectable({providedIn:'root'})export class AService {」
providedIn: 'root' 通知 Angular在根注入器中注册这个服务。
若这种形式注册,就不必在 @NgModule 装璜器中写 providers 。并且在代码编译打包时, 会进行摇树优化,会移除所有没在利用中应用过的服务。比拟举荐。
- @NgModule 中的 providers属性
@NgModule({ providers: [ HeroService, // { provide: HeroService, useValue: HeroService } ],
若service中没有在根注入器中注入该服务,若咱们想在组件中应用service,就须要应用手动注入service。
注入的辨认是通过参数的字符名称token, 所以{ provide: HeroService, useValue: HeroService }
的 provide就是咱们设置的名称token, useValue示意应用哪个服务。
若名称与service名雷同,咱们也能够简化,间接应用HeroService。
- @Component 元数据中的 providers属性
// service.ts@Injectable() // component.ts@Component({ ... selector: 'app-heroes', providers: [ HeroService ]})
这种形式和@NgModule差不多。
因为不晓得我援用的外置service是否注入了根注入器,我先假如它没有注入,于是手动在@NgModule中注入了一下。代码如下。
@NgModule({ declarations: [], imports: [ CommonModule, IndexModule, LabelRoutingModule, ], providers: [ ThyNotifyService ]})
注入之后报错仍旧。
最初解决形式:
最初尝试了很屡次,
解决形式是在providers ThyNotifyService的根底上再引入一个ThyNotifyModule
。如下第7和10行。
1 @NgModule({2 declarations: [],3 imports: [4 CommonModule,5 IndexModule,6 LabelRoutingModule,7 ThyNotifyModule8 ],9 providers: [10 ThyNotifyService11 ],})
因为不太分明这些外置组件库的实现形式,最初也没太搞懂为什么应用ThyNotifyService 须要引入ThyNotifyModule。
官网也没写分明须要引入这个。所以也试了不久。
可能是有些货色依赖ThyNotifyModule。
至于为什么应用ThyNotifyService,会造成循环依赖,应用另一个ThyDialog就不会
为什么privide能解决循环依赖等问题,因为最近比较忙,等之后有工夫再补充。
参考:
https://blog.csdn.net/sllailc...
https://yuyang041060120.githu...