Angular 2 依赖注入:无法解析所有参数(没有 dep 链,没有桶)
Angular 2 Dependency Injection: Can't resolve all parameters (no dep chain, no barrel)
我一直在尝试按照 ng-book 2 中的一个示例和 运行 进入 DI 章节中的困难。
@Component({
selector: 'app-root',
template: `
<button (click)="invokeService()">Get Value</button>
`
})
export class AppComponent {
constructor(public myService: MyService) {}
invokeService() {
console.log(this.myService.getValue());
}
}
@Injectable()
export class MyService {
getValue(): string {
return 'a value';
}
}
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule
],
providers: [MyService],
bootstrap: [AppComponent]
})
export class AppModule { }
这里有一个 plunker https://plnkr.co/edit/KSXE9tnRj4tffiISyp0i 它在手动创建 ReflectiveInjector 时完全有效,但是当我尝试采用简单的方法并在 NgModule 的提供程序中声明它时,它无法给我 "Can't resolve all dependencies for AppComponent"。我检查了其他答案,如您所见,没有循环依赖或与桶相关的问题——它们都在一个文件中。任何提示将不胜感激!
如果您将多个 类 放在一个文件中(我确定这仅用于测试),则必须检查文件的顺序。假设您的 AppComponent
引用了您的 MyService
,因此 MyService
的定义必须放在 AppComponent
之上。因此,您的代码必须如下所示:
import { Component, ReflectiveInjector, Injectable, Inject } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
@Injectable()
export class MyService {
constructor() {}
getValue(): string {
return 'a value';
}
}
@Component({
selector: 'app-root',
template: `
<button (click)="invokeService()">Get Value</button>
`
})
export class AppComponent {
// private myService: MyService;
constructor(public myService: MyService) {
// let injector: any = ReflectiveInjector.resolveAndCreate([MyService]);
// this.myService = injector.get(MyService);
// console.log('Same instance? ', this.myService === injector.get(MyService));
}
invokeService() {
console.log(this.myService.getValue());
}
}
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule
],
providers: [MyService],
bootstrap: [AppComponent]
})
export class AppModule { }
我一直在尝试按照 ng-book 2 中的一个示例和 运行 进入 DI 章节中的困难。
@Component({
selector: 'app-root',
template: `
<button (click)="invokeService()">Get Value</button>
`
})
export class AppComponent {
constructor(public myService: MyService) {}
invokeService() {
console.log(this.myService.getValue());
}
}
@Injectable()
export class MyService {
getValue(): string {
return 'a value';
}
}
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule
],
providers: [MyService],
bootstrap: [AppComponent]
})
export class AppModule { }
这里有一个 plunker https://plnkr.co/edit/KSXE9tnRj4tffiISyp0i 它在手动创建 ReflectiveInjector 时完全有效,但是当我尝试采用简单的方法并在 NgModule 的提供程序中声明它时,它无法给我 "Can't resolve all dependencies for AppComponent"。我检查了其他答案,如您所见,没有循环依赖或与桶相关的问题——它们都在一个文件中。任何提示将不胜感激!
如果您将多个 类 放在一个文件中(我确定这仅用于测试),则必须检查文件的顺序。假设您的 AppComponent
引用了您的 MyService
,因此 MyService
的定义必须放在 AppComponent
之上。因此,您的代码必须如下所示:
import { Component, ReflectiveInjector, Injectable, Inject } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
@Injectable()
export class MyService {
constructor() {}
getValue(): string {
return 'a value';
}
}
@Component({
selector: 'app-root',
template: `
<button (click)="invokeService()">Get Value</button>
`
})
export class AppComponent {
// private myService: MyService;
constructor(public myService: MyService) {
// let injector: any = ReflectiveInjector.resolveAndCreate([MyService]);
// this.myService = injector.get(MyService);
// console.log('Same instance? ', this.myService === injector.get(MyService));
}
invokeService() {
console.log(this.myService.getValue());
}
}
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule
],
providers: [MyService],
bootstrap: [AppComponent]
})
export class AppModule { }