Angular 2 - 无法解析LoginService的所有参数

时间:2016-08-31 08:25:42

标签: angular typescript

我有一个小问题,似乎是关于依赖注入。我已经做了一个HttpClient服务来验证我的电话,我已经这样说了:

@Injectable()
export class HttpClient {
  constructor(private _http: Http, private _cookieService: CookieService, private _loginService: LoginService) {}
  ...
}

错误来自带有LoginService注入的此文件(如果我删除它,应用程序可以正常工作)。请注意,我已经在其他一些文件中注入了LoginService,并且没有任何问题,并且也正确导入。

错误就是这个:

  

zone.min.js:1错误:(SystemJS)无法解析LoginService的所有参数:(?,CookieService)

如果可以提供帮助,请按照以下方式声明LoginService:

@Injectable()
export class LoginService {
  constructor (private _apiEndpoint: ApiEndpoint, private _cookieService: CookieService) {}
  ...
}

并且他们都在app.module.ts的应用提供商中:

providers: [
    ApiEndpoint,
    HTTP_PROVIDERS,
    CookieService,
    LoginService,
    HttpClient,
    provide(LocationStrategy, {useClass: HashLocationStrategy}),
    provide(ExceptionHandler, {useClass: MyExceptionHandler})
],

有人有想法吗?谢谢!

1 个答案:

答案 0 :(得分:2)

如评论中所述,问题是循环依赖。在您说HttpClient需要LoginService之前,设计似乎很好。您的依赖关系链如下所示:

LoginService> ApiEndpoint> HttpClient -x- LoginService

  • LoginService需要ApiEndpoint才有意义
  • ApiEndpoint需要HttpClient才有意义
  • HttpClient不应该依赖于LoginService

您需要在LoginService中找到HttpClient需要的内容并将其带入自己的服务中。您的依赖关系应该是这样的。

 @Injectable()
 export class LoginService {
   constructor(apiEndpoint: ApiEndpoint, newServiceWithCommonStuff: NewServiceWithCommonStuff) {}
 }

 @Injectable()
 export class ApiEndpoint {
   constructor(httpClient: HttpClient) {}
 }

 @Injectable()
 export class NewServiceWithCommonStuff {

 }

 @Injectable()
 export class HttpClient {
   constructor(newServiceWithCommonStuff: NewServiceWithCommonStuff) {}
 }
  • LoginService> ApiEndpoint> HttpClient的
  • LoginService> NewServiceWithCommonStuff
  • HttpClient> NewServiceWithCommonStuff