Angular 2 Di не работает - не удается разрешить все параметры для

Я создал простое приложение Hello World, которое отлично работает. Но когда я хочу добавить "Сервис" просто ди, я получил следующие ошибки:

angular2.dev.js: 23877 ИСКЛЮЧЕНИЕ: Не удается разрешить все параметры для 'AppComponent'(?). Убедитесь, что все параметры оформлены с помощью Inject или имеют допустимые аннотации типов, а AppComponent - с Injectable.

angular2-polyfills.js: 469 Необработанный отказ от обещания: невозможно разрешить все параметры для 'AppComponent'(?). Убедитесь, что все параметры оформлены с помощью Inject или имеют допустимые аннотации типов, а AppComponent - с Injectable.; Зона: угловая; Задача: Promise.then; Значение:

У меня 3 файла

boot.ts:

///<reference path="../../node_modules/angular2/typings/browser.d.ts"/>
import {bootstrap} from 'angular2/platform/browser'
import {AppComponent} from './mainApp'
bootstrap(AppComponent);

mainApp.ts:

import {Component} from 'angular2/core';
import {CourseService} from './course.service';


@Component({
    selector: 'my-app',
    template: 'My First Angular 2 App',
    providers: [CourseService],
})
export class AppComponent {
    constructor(courseService: CourseService) {
    }
} 

course.service.ts:

export class CourseService {
   public getCourses(): string[] {
      let courses: string[] = ["Course 1", "Course 2", "Course 3"];
      return courses;
  }
}

когда я удаляю параметры из конструктора, все работает нормально.

Это глава моего HTML-документа, и я использую угловую 2 бета 13:

<script src="~/Scripts/es6-shim.min.js"></script>
<script src="~/Scripts/system-polyfills.js"></script>
<script src="~/Scripts/shims_for_IE.js"></script>
<script src="~/Scripts/angular2-polyfills.js"></script>
<script src="~/Scripts/system.js"></script>
<script src="~/Scripts/Rx.js"></script>
<script src="~/Scripts/angular2.dev.js"></script>

<!-- 2. Configure SystemJS -->
<script>
    System.config({
        packages: {
            'ScriptsApp/views': {
                defaultExtension: 'js'
            }
        }
    });
</script>
<script>
    System.import('ScriptsApp/views/boot').then(null, console.error.bind(console));
</script>

Обновите эти СЕЙЧАС мои ​​фиксированные настройки TypeScript csproj

<TypeScriptTarget>ES5</TypeScriptTarget>
<TypeScriptJSXEmit>None</TypeScriptJSXEmit>
<TypeScriptCompileOnSaveEnabled>True</TypeScriptCompileOnSaveEnabled>
<TypeScriptNoImplicitAny>False</TypeScriptNoImplicitAny>
<TypeScriptModuleKind>CommonJS</TypeScriptModuleKind>
<TypeScriptRemoveComments>False</TypeScriptRemoveComments>
<TypeScriptOutFile />
<TypeScriptOutDir />
<TypeScriptGeneratesDeclarations>False</TypeScriptGeneratesDeclarations>
<TypeScriptNoEmitOnError>True</TypeScriptNoEmitOnError>
<TypeScriptSourceMap>True</TypeScriptSourceMap>
<TypeScriptMapRoot />
<TypeScriptSourceRoot />
<TypeScriptExperimentalDecorators>True</TypeScriptExperimentalDecorators>
<TypeScriptEmitDecoratorMetadata>True</TypeScriptEmitDecoratorMetadata>

В Новейшем обновлении VS 2015 вы также можете использовать tsconfig.json, тогда параметры решения для TypeScript игнорируются. Мой текущий пример для моего tsconfig.json:

 {
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false,
    //Kümmert sich um die Typings das diese entsprechend gefunden werden, keine Reference mehr in boot.js notwendig. Geht aber in VS nicht!
    //"lib": ["es6"],
    "types": [
      "node" //wird für RequireJs benötigt, damit z.b. der Typ gefunden werden kann
    ]
  },
  //Wird für den AwesomeTypeScriptLoad in WebPack benötigt!
   "awesomeTypescriptLoaderOptions": {
     "useWebpackText": true
   },
  "exclude": [
       "node_modules",
       "dist",
       "typings/main",
       "typings/index.d.ts"
     ],
     "compileOnSave": true
   }

3 ответа

Решение

Обновить

После обновления в вопросе OP уже использует Typescript, я бы предложил вам добавить emitDecoratorMetadata: true внутри вашего tsconfig.json, Это необходимо, чтобы вывод JavaScript создавал метаданные для декораторов внутри переданного файла сценария.


Вам нужно добавить @Inject создать экземпляр CourseService внутри AppComponent

constructor(@Inject(CourseService) courseService: CourseService) {
}

В случае, если вы используете машинопись, вам не нужно иметь @Inject декоратор там на месте. Машинопись сделала это для вас.

Я смог решить эту проблему, добавив:

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

в компоненте и комментируя сервис для добавления:

constructor(@Inject(CourseService) courseService: CourseService) {

В моем случае проблема была вызвана @angular/forms . Если вы используете его рядом с неисправным компонентом, начните проверять ваши @ angular / forms и найдите исправление вокруг него.

Другие вопросы по тегам