我已经用Angular构建了一个基本的应用程序,但是我遇到了一个奇怪的问题,我不能将服务注入到我的一个组件中。但是,它可以很好地注入我创建的其他三个组件。

对于初学者来说,这是服务:

import { Injectable } from '@angular/core';

@Injectable()
export class MobileService {
  screenWidth: number;
  screenHeight: number;

  constructor() {
    this.screenWidth = window.outerWidth;
    this.screenHeight = window.outerHeight;

    window.addEventListener("resize", this.onWindowResize.bind(this) )
  }
  
  onWindowResize(ev: Event) {
    var win = (ev.currentTarget as Window);
    this.screenWidth = win.outerWidth;
    this.screenHeight = win.outerHeight;
  }
  
}

以及它拒绝使用的组件:

import { Component, } from '@angular/core';
import { NgClass } from '@angular/common';
import { ROUTER_DIRECTIVES } from '@angular/router';

import {MobileService} from '../';

@Component({
  moduleId: module.id,
  selector: 'pm-header',
  templateUrl: 'header.component.html',
  styleUrls: ['header.component.css'],
  directives: [ROUTER_DIRECTIVES, NgClass],
})
export class HeaderComponent {
  mobileNav: boolean = false;

  constructor(public ms: MobileService) {
    console.log(ms);
  }

}

我在浏览器控制台得到的错误是这样的:

EXCEPTION:不能解析HeaderComponent:(?)的所有参数。

我在bootstrap函数中有服务,所以它有一个提供者。而且我似乎能够将它注入到任何其他组件的构造函数中而没有任何问题。


当前回答

对我来说,这个问题甚至更烦人,我正在使用服务中的服务,忘记在appModule中添加它作为依赖项! 希望这能帮助一些人节省几个小时的应用程序分解,只是重新建立它

其他回答

除了前面给出的答案外,当您的可注射服务缺少实际的@Injectable()装饰器时,似乎也会抛出这个错误。因此,在调试循环依赖关系以及导入/导出的顺序之前,请简单检查一下服务是否确实定义了@Injectable()。

这适用于当前Angular的最新版本——Angular 2.1.0。

我就此事发表了一期文章。

就我而言,原因如下:

我的可注入服务A扩展了另一类B B有一个需要参数的构造函数 我没有在A中定义任何构造函数

因此,在尝试创建对象a时,默认构造函数失败了。我不知道为什么这不是一个编译错误。

我通过在a中添加一个构造函数来解决这个问题,它正确地调用了B的构造函数。

import {Injector} from '@angular/core'; import {ServiceA} from './service-a'; @ component ({ / /…… }) 类MyComp { 构造函数(私有注入器:injector) { const serviceA = injector.get(serviceA); } }

通过将服务A注入到服务B中,我也遇到了这种情况,反之亦然。

我认为这种快速失败是件好事,因为无论如何都应该避免。如果您希望您的服务更加模块化和可重用,最好尽可能避免循环引用。这篇文章强调了围绕这一点的陷阱。

因此,我有以下建议:

如果您觉得类之间的交互太频繁(我说的是特性嫉妒),您可能会考虑将这两个服务合并到一个类中。 如果上面的方法对你不起作用,考虑使用第三个服务(EventService),两个服务都可以注入它来交换消息。

在可能的情况下,错误是由升级@angular-devkit/build-angular到~0.803.*引起的。详情见https://github.com/angular/angular-cli/issues/15892。