Angular 2:全球AppInjector。如何避免警告和循环依赖"

时间:2017-09-04 19:39:35

标签: angular typescript

在我的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编译器警告我循环依赖(因为AppInjectorWARNING 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。但我想避免使用此服务搞乱我的函数参数。

1 个答案:

答案 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);

(不需要手动转换结果;编译器应该知道您的服务类型。)