当前位置: 首页 > 知识库问答 >
问题:

尝试将服务注入角组件时出错"异常:无法解析组件的所有参数",为什么?

王炜
2023-03-14

我已经在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);
  }

}

我在浏览器控制台中遇到的错误如下:

异常:无法解析HeaderComponent:(?)的所有参数。

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

共有3个答案

徐嘉谊
2023-03-14

从Angular2.2.3开始,现在有一个forwardRef()实用程序函数,允许您插入尚未定义的提供程序。

通过未定义,我的意思是依赖注入映射不知道标识符。这就是循环依赖关系期间发生的情况。在Angular中,您可以有非常难以解开和查看的循环依赖关系。

export class HeaderComponent {
  mobileNav: boolean = false;

  constructor(@Inject(forwardRef(() => MobileService)) public ms: MobileService) {
    console.log(ms);
  }

}

添加@Inject(forwardRef)()=

角2手册:转发参考

角2中的正向引用

韦泳
2023-03-14

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

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

我就这件事提出了一个问题。

易星纬
2023-03-14

从直接声明它的文件(而不是桶)导入它。

我不知道到底是什么导致了这个问题,但我看到它被提到了几次(可能是某种循环依赖)。

它也应该可以通过改变桶中出口的顺序来修复(不知道细节,但也提到了)

 类似资料:
  • 我有一个Angular2项目2.0.0,在试图加载该项目时,浏览器中出现了以下错误: 误差 Metadata_Resolver.js:508未捕获错误:无法解析CustomerService:(AngularFireDatabase,?,Token_FirebaseApp)的所有参数。(…)CompileMetadataResolver.getDependenciesMetadata@metada

  • 在我的库中,我有一个带有以下代码的服务: (现有原因只是避免循环依赖):

  • 我试图将我的类组件转换为功能组件,但我的过滤器不再工作了。 主要的错误是当我想转换listProducts因为我不知道如何定义与useState为这种情况下的preState 如何能为情况更新状态? 这是我的密码 类组件 功能成分

  • 我在我的Angular 2项目中为我的ag-grid声明了几个editorFrameWork组件。但是,当我在编辑器组件的构造函数中插入任何服务时,TypeScript编译器会在加载网页时引发以下错误: 对于另一个需要注入服务的编辑器组件,我已经解决了这个问题,方法是为该组件声明一个模块,并将该模块包含在app.module中。但是,如果我将第二个编辑器组件模块与第一个编辑器组件模块一起添加到下面

  • 我尝试安装java并使用XLConnect包mmethods(两者都是),但是我得到了如下所示的错误: 我绝对不是试图加载一个空文件,我绝对有访问/权限从文件位置读取。我可能做错了什么? R read_excel:libxls错误:无法解析文件