【问题标题】:Angular 6 - can't resolve all parameters for AppComponentAngular 6 - 无法解析 AppComponent 的所有参数
【发布时间】:2018-06-21 10:04:30
【问题描述】:

我正在尝试使用 Angular 6 构建应用程序,但我仍在设置所有内容。但是我的应用程序中的依赖注入似乎有问题。

它无法解析任何构造函数参数。它们都导致Uncaught Error: Can't resolve all parameters for AppComponent: (?).。即使是自定义服务也会导致相同的错误。

版本 (省略了对此没有任何影响的依赖)

 "dependencies": {
    "@angular/common": "6.0.5",
    "@angular/compiler": "6.0.5",
    "@angular/core": "6.0.5",
    "@angular/forms": "6.0.5",
    "@angular/http": "6.0.5",
    "@angular/platform-browser": "6.0.5",
    "@angular/platform-browser-dynamic": "6.0.5",
    "@angular/router": "6.0.5",
    "core-js": "2.5.7",
    "reflect-metadata": "0.1.12",
    "rxjs": "6.2.1",
    "zone.js": "0.8.26"
  },
  "devDependencies": {
    "@angular/compiler-cli": "6.0.5",
    "@ngtools/webpack": "6.0.8",
    "angular2-template-loader": "0.6.2",
    "awesome-typescript-loader": "5.1.0",
    "typescript": "2.7.2",
    "webpack": "4.12.0",
    "webpack-cli": "3.0.8",
    "webpack-dev-server": "3.1.4",
  }

app.module.ts

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule {
}

TestService.ts

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

@Injectable({
  providedIn: 'root'
})
export class TestService {

  constructor() {
    console.warn("It works!");
  }

  public sayHello(): string {
    return "hello world!";
  }
}

App.component.ts

import {Component} from '@angular/core';
import {TestService} from "./TestService";

@Component({
  selector: 'sh-home',
  styleUrls: ['./home.scss'],
  templateUrl: './home.html'
})
export class HomeComponent {

  constructor(testService: TestService) {
    testService.sayHello();
  }
}

TestService 的注入在这种情况下会出现错误


Main.ts

import {enableProdMode} from '@angular/core';
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';

import {AppModule} from './app/app.module';
import './assets/scss/styles.global.scss'; // Import the global scss files

// Polyfills
import './Polyfills';

if (process.env.NODE_ENV === 'production') {
    enableProdMode();
}

platformBrowserDynamic().bootstrapModule(AppModule);

Polyfills.ts

/** IE9, IE10 and IE11 requires all of the following polyfills. **/
import 'core-js/es6/symbol';
import 'core-js/es6/object';
import 'core-js/es6/function';
import 'core-js/es6/parse-int';
import 'core-js/es6/parse-float';
import 'core-js/es6/number';
import 'core-js/es6/math';
import 'core-js/es6/string';
import 'core-js/es6/date';
import 'core-js/es6/array';
import 'core-js/es6/regexp';
import 'core-js/es6/map';
import 'core-js/es6/weak-map';
import 'core-js/es6/set';

/** IE10 and IE11 requires the following for NgClass support on SVG elements */
import 'classlist.js';  // Run `npm install --save classlist.js`.

/** IE10 and IE11 requires the following for the Reflect API. */
import 'core-js/es6/reflect';


/** Evergreen browsers require these. **/
// Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove.
import 'core-js/es7/reflect';

/***************************************************************************************************
 * Zone JS is required by default for Angular itself.
 */
import 'zone.js/dist/zone';  // Included with Angular CLI.

我没有使用 CLI,而是使用自定义启动器。我包含了与 Angular-CLI 相同的所有 polyfill,所以我没有遗漏任何内容。

有人看到我做错了吗?


更新

我简化了测试用例,发现它不是翻译模块。即使我创建了一个简单的服务,我也不能使用依赖注入。将服务添加到 providers 列表也不起作用(而且也没有必要,因为我使用的是 Angular 6 'provideIn: root')。

【问题讨论】:

  • 您是否在providers : [] 下的app.module.ts 中添加了此服务:TranslateService
  • 试过了,但没有成功:(
  • 什么是错误
  • 未捕获的错误:无法解析 AppComponent 的所有参数:(?)。
  • 您找到解决方案了吗?我遇到了完全相同的问题

标签: angular typescript dependency-injection angular6 ngx-translate


【解决方案1】:

确保您在 polyfills 中有以下导入:

import 'core-js/es7/reflect';

【讨论】:

  • 我正在导入'core-js/es7/reflect' 所以我想这不可能:(
  • test.ts 中添加了import 'core-js/es7/reflect'; 并为我解决了问题。
  • 几乎已经失去了我所有的头发,谢谢,这对我来说很好:)
【解决方案2】:

GET / 或编译器错误can't resolve all parameters for ApplicationModule: (?).

只需按照这些简单的步骤:

  1. 安装 core-js 模块。

npm i core-js

  1. polyfills.ts文件中添加import语句

import 'core-js/es7/reflect';

  1. main.ts 文件中添加导入语句

import 'core-js/es6/reflect';

import 'core-js/es7/reflect';

【讨论】:

    【解决方案3】:

    我也遇到了这个问题,但是在 tsconfig 中设置 emitDecoratorMetadata": true 解决了这个问题。记得重启服务器。

    tsconfig.spec.json

       "compilerOptions": {
        "emitDecoratorMetadata": true,
         "outDir": "./out-tsc/spec",
       }
    

    【讨论】:

      【解决方案4】:

      我通过重新启动应用程序解决了这个错误。再次构建并运行它,它对我来说很好。请检查并告诉我。

      谢谢:)

      【讨论】:

      【解决方案5】:

      @Inject 帮我解决了问题

      import {Component, Inject} from '@angular/core';
      import {TestService} from "./TestService";
      
      @Component({
        selector: 'sh-home',
        styleUrls: ['./home.scss'],
        templateUrl: './home.html'
      })
      export class HomeComponent {
      
        constructor(@Inject(TestService) testService: TestService) {
          testService.sayHello();
        }
      }
      

      【讨论】:

      • 它可能有效,但根据 Angular 文档 (angular.io/guide/dependency-injection),这应该与仅使用 constructor(testService: TestService) {} 相同。所以Angular依赖注入器肯定有问题。
      【解决方案6】:

      您可以尝试进行以下更改:

      import {Component} from '@angular/core';
      import {TestService} from "./TestService";
      
      @Component({
        selector: 'sh-home',
        styleUrls: ['./home.scss'],
        templateUrl: './home.html',
        viewProviders: [TestService]
      })
      export class HomeComponent {
         constructor(private testService: TestService) {
           this.testService.sayHello();
         }
      }
      

      viewProviders 创建一个特殊的注入器,只为这个组件解析依赖。

      【讨论】:

      • 但这意味着我必须在每个组件中都这样做,而使用 Angular-cli 我不必这样做。所以我缺少一些东西..
      • 你找到解决这个问题的方法了吗?
      【解决方案7】:

      我在 Angular 8 应用上收到了同样的错误

      无法解析 AppComponent 的所有参数:(?,?,?)

      在 constructor() 中更改 1 个参数类型后。

      我通过停止并重新启动应用程序解决了问题。

      【讨论】:

        【解决方案8】:

        我在 Angular 8 中的一个组件上遇到了同样的问题。构造函数有多个服务作为参数。

        例如,

        constructor(
          private router: Router,
          private fooService: FooService,
          private barService: BarService,
          private fubarService: FoobarService,
          private anotherService: AnotherService)
        {}
        

        @Inject()做实验,有些参数会接受,有些不会。他们会抱怨参数类型。

        FooService, BarService and FubarService 的共同点是它们在物理上位于同一个目录中。我创建了一些子目录并在每个子目录中放置了一项服务——编译器错误消失了。

        A blog postforwardRef 为他们工作。它对我不起作用。但是,他们的文章提供了对可能发生的情况的见解。

        编辑添加:

        在另外两种情况下,上述方法不起作用。在一种情况下,将服务的导入从完整路径 (src/app/...) 更改为相对路径消除了编译器投诉(见图)。在第二种情况下,添加@Inject(ServiceName) public service: ServiceName 解决了这个问题。

        在上述所有情况下,使用 Angular 的 Ionic 5 项目都没有编译投诉。 Ionic 项目使用 Angular 8.2.14。 Angular 项目使用的是 8.2.0(我创建项目时各个 CLI 的默认值)。

        看起来某个地方潜伏着一些错误......

        【讨论】:

          【解决方案9】:

          我在使用 Angular 8.2.13 + Typescript 时也遇到了同样的问题。最后诀窍是使用@Inject('RefOnlyUsedForTesting'),即使类型是string

          export abstract class MyBaseClass {
            ....
            constructor(@Inject(ElementRef) elementRef: ElementRef,
                    @Optional() @Inject('RefOnlyUsedForTesting') dep1: MyObject,
                    @Optional() @Inject('RefOnlyUsedForTesting') dep2: string,
                    @Optional() @Inject('RefOnlyUsedForTesting') dep3: string) {
            super();    
            ...
           }
          }
          

          【讨论】:

            【解决方案10】:

            如果你使用 webpack 和 babel 来构建 Angular,很可能你缺少这个 babel 插件: babel-plugin-transform-typescript-metadata

            【讨论】:

              猜你喜欢
              • 2020-01-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-09-21
              • 2021-04-22
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多