我想避免将每个服务都导入到我的所有Angular 4组件中,所以我创建了这样的东西
import * as UtilityService from '../../services/utility.service';
而不是这样做
import { AppStateService, InternalStateType } from '../services/appstate.service';
import { Logging } from '../services/utility.service';
import { AuthenticationService } from '../services/authentication.service';
import { DataService } from '../services/data.service';
import { Utils } from '../services/utility.service';
import { RouteProtectionService } from '../services/route-protection.service';
import { UrlManagementService } from '../services/url-managing.service';
现在,我可以通过引用UtilityService.Classname
,即UtilityService.AppState
,UtilityService.Authentication
等来访问任何组件中的所有类。
constructor(
public appState: UtilityService.AppState,
public utilities: UtilityService.Utils,
public dataService: UtilityService.Data,
private appInsightsService: UtilityService.AppInsights,
private titleService: UtilityService.Titles) {
}
然后在utility.service.ts里面,我有这个
export { AppState, InternalStateType } from './appstate.service';
export { Authentication } from './authentication.service';
export { Data } from './data.service';
export { RouteProtection } from './route-protection.service';
export { UrlManagement } from './url-managing.service';
export { AppInsightsService } from '@markpieszak/ng-application-insights';
export { Title } from '@angular/platform-browser';
它在打字稿中编译得很好,但在运行应用程序时,有角度抱怨
Error: Can't resolve all parameters for Authentication: ([object Object], [object Object], ?, ?, ?).
我已经在AppModule中为每个提供程序指定了提供程序,并且在我正常导入类时它可以正常工作。那么为什么我不能导入一桶类并在Angular依赖注入中使用它们呢?
答案 0 :(得分:1)
通常由于循环依赖性而出现此错误。如果没有所有源代码信息,很难识别服务,这实际上会导致循环依赖性问题。
我建议将服务逐个添加到构造函数中,并确定导致此错误的服务并解决它。
如果您无法识别问题或需要循环依赖,请手动解决依赖关系,如下所示
import { Injector } from '@angular/core';
constructor( private injector: Injector) {
this.myService = this.injector.get(MyService);
}
或
import { ReflectiveInjector } from '@angular/core';
constructor() {
var injector= ReflectiveInjector.resolveAndCreate([MyService]);
let myservice=injector.get(MyService);
}
您可以从以下链接了解这些注射器。根据您的需要使用注射器或反射注射器。
Difference between Reflective Injector and Injector in Angular
答案 1 :(得分:1)
如果您在网络浏览器中打开开发者控制台,您可能会看到如下错误:
(SystemJS)遇到未定义的提供者!通常这意味着您有一个循环依赖(可能是由于使用'桶' index.ts文件引起的。)
The Angular glossary称这种类型的重新导出“桶”。
将多个ES2015模块的导出汇总到一个方便的ES2015模块中的方法。
那桶'是您用于重新导出模块的技术。不幸的是,它可能导致循环依赖。
解决方案:删除循环依赖项,如associated GitHub issue here says。