如何将特定于组件的值注入服务?

Phi*_*Cap 0 dependency-injection angular2-services angular

我很清楚我们如何注入服务。我们可以在模块级别或组件级别提供服务。

我希望在该服务依次注入我的组件之前向该服务注入一个特定的属性。有问题的属性取决于我的组件。

如何在 Angular 2 中实现这一点?

例子:

@Injectable()
export class MyService {
  constructor(myProperty: string) {
    setSomethingUsingMyProperty(myProperty)
  }
}

@Component(..., {providers: [MyService] })
export class MyComponent {
  constructor(myService: MyService) {
    myService.doSomething()
  }
}
Run Code Online (Sandbox Code Playgroud)

如果我在上层模块中提供该属性,我认为如果我包含该@Inject指令,Angular 可以注入该属性。但是如何在组件级别实现这一点呢?

Gün*_*uer 9

您可以通过字符串名称提供和注入,例如

@Injectable()
export class MyService {
  constructor(@Inject('someName') myProperty: String) {
    setSomethingUsingMyProperty(myProperty)
  }
}
Run Code Online (Sandbox Code Playgroud)
@Component({..., 
  providers: [MyService, {provide: 'someName', useValue: 'someValue'}] })
export class MyComponent {
  constructor(myService: MyService) {
    myService.doSomething()
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你在 `@NgModule` 上提供 `MyService` 而不是 `@Component`,这将不起作用。当 DI 创建一个提供者的实例时,它会从同一个注入器的其他提供者开始(在我的回答中,这是组件的注入器),如果它没有找到提供者,它会查看父组件注入器,直到它到达`应用组件`。如果在那里找不到提供者,它会查找`@NgModule` 提供的提供者。在我的回答中。提供者在它查找的第一个位置找到并被注入。除了父组件,您不能注入其他组件。 (2认同)
  • 当父组件提供`someName` 而当前组件没有提供时,根据上述规则,它会在DI 寻找它的第二个位置找到它。 (2认同)