我正在关注依赖注入的角度文档,并尝试复制dependency injection tokens上的部分。
在单独的JS模块中定义OpaqueToken
// app-config.ts
import { OpaqueToken } from '@angular/core';
export let APP_CONFIG = new OpaqueToken('app.config');
// use class instead of interface
export interface AppConfig {
apiEndpoint: string;
title: string;
}
export const HERO_DI_CONFIG: AppConfig = {
apiEndpoint: 'api.heroes.com',
title: 'Dependency Injection'
};
导入APP_CONFIG
&还定义APP_CONFIG2
// app-modules.ts
import { APP_CONFIG, HERO_DI_CONFIG } from './app-config.ts';
export let APP_CONFIG2 = new OpaqueToken('app.config2');
@NgModule({
imports: [ BrowserModule ],
declarations: [ App ],
providers: [
{provide: APP_CONFIG, useValue: HERO_DI_CONFIG},
{provide: APP_CONFIG2, useValue: HERO_DI_CONFIG},
],
bootstrap: [ App ]
})
和inject
进入Component构造函数
// app.ts
import { APP_CONFIG, AppConfig } from './app-config.ts'
import { APP_CONFIG2 } from './app-module.ts'
export class App {
constructor(
@Inject(APP_CONFIG) public opaqueToken: AppConfig
@Inject(APP_CONFIG2) public opaqueToken2: any
) {
this.name = 'Angular2'
this.local = LOCAL_STRING
}
}
正确注入在外部模块中定义的 APP_CONFIG
,但APP_CONFIG2
与provide
在同一模块中定义会引发错误。那是为什么?
VM466 zone.js:323Error: (SystemJS) Error: Can't resolve all parameters for App: (Token_app_config, ?,
答案 0 :(得分:1)
这不是Angular的问题,而是es6模块之间的循环依赖。
在您的示例中,app.ts
从APP_CONFIG
导入app.module.ts
和来自app.module.ts
的{{1}} App
。{/ p>
这会创建一个无法解析的循环依赖。
答案 1 :(得分:0)
要使其有效,您必须从APP_CONFIG2
导出app-config.ts
并从app-config.ts
和app-modules.ts
文件中的app.ts
导入:
// app-config.ts
import { OpaqueToken } from '@angular/core';
export let APP_CONFIG = new OpaqueToken('app.config');
export let APP_CONFIG2 = new OpaqueToken('app.config');