在我的Angular App中,我有一个名为AppInjector的全局变量,它返回Injector。此变量在AppModule
。
export let AppInjector: Injector;
@NgModule({
declarations: [
AppComponent,
],
bootstrap: [AppComponent],
})
export class AppModule {
constructor(private injector: Injector) {
AppInjector = this.injector;
}
}
我有一些帮助函数可以在AppInjector
特殊服务的帮助下获得。辅助函数位于单独的文件中,不属于任何组件。例如:
function initNodeTemplate() {
diagram.nodeTemplateMap.add(NodeCategory.Question,
GO(go.Node, "Auto",
{
click: (evt, obj) => {(AppInjector.get(MyService) as MyService).myFunction(obj)},
},
// other stuff ...
));
}
问题是Angular编译器警告我循环依赖(因为AppInjector
。WARNING in Circular dependency detected:
src\app\app.module.ts -> src\app\frame\frame.module.ts -> src\app\designer\designer.module.ts -> src\app\designer\designer.component.ts -> src\app\designer\helpers\templates.helper.ts -> src\app\app.module.ts
。
如何摆脱此警告?
我知道我可以将一个服务注入一个组件,然后将服务传递给帮助函数。在这种情况下,我可以将detailService
作为参数传递给initNodeTemplate()
,因此我不再需要AppInjector
。但我想避免使用此服务搞乱我的函数参数。
答案 0 :(得分:3)
避免这种情况的一种简单方法是让您的类从不同于声明/提供这些类的AppInjector
的内容导入AppModule
。
所以,添加一个助手,例如app-injector.ts
:
import {Injector} from '@angular/core';
/**
* Allows for retrieving singletons using `AppInjector.get(MyService)` (whereas
* `ReflectiveInjector.resolveAndCreate(MyService)` would create a new instance
* of the service).
*/
export let AppInjector: Injector;
/**
* Helper to access the exported {@link AppInjector}, needed as ES6 modules export
* immutable bindings; see http://2ality.com/2015/07/es6-module-exports.html
*/
export function setAppInjector(injector: Injector) {
if (AppInjector) {
// Should not happen
console.error('Programming error: AppInjector was already set');
}
else {
AppInjector = injector;
}
}
然后在AppModule
中,使用:
import {Injector} from '@angular/core';
import {setAppInjector} from './app-injector';
export class AppModule {
constructor(injector: Injector) {
setAppInjector(injector);
}
}
......而在其他课程中仍然使用:
import {AppInjector} from './app-injector';
const myService = AppInjector.get(MyService);
(不需要手动转换结果;编译器应该知道您的服务类型。)