Angular 5 Injector - 如何注入字符串

时间:2018-03-09 21:04:13

标签: angular dependency-injection angular5

我正在尝试将字符串注入到我的角度组件中。 下面的代码工作正常,但它给出了弃用警告: get已弃用:从v4.0.0开始使用Type或InjectionToken

@Component({
  selector: 'app-label',
  templateUrl: './label.component.html',
  styleUrls: ['./label.component.scss']
})
export class LabelComponent {
  public name: string;
  public caption: string;
  constructor(
    private injector: Injector
  ) {
    this.name = this.injector.get('name');
    this.caption = this.injector.get('caption');
  }
}

所以我尝试使用这个非常简短且不完整的文档Angular 5 Injector  提出类似下面的内容,但我不想useValueuseClass,我需要的是注入的实际值。

    class BS { }
    // [..]
    const name = new InjectionToken<string>('name');
    const caption = new InjectionToken<string>('caption');
    const injector = ReflectiveInjector.resolveAndCreate([
      { provide: name, useClass: BS},
      { provide: caption, useClass: BS}
    ]);
    this.name = this.injector.get(name);
    this.caption = this.injector.get(caption);
    console.log(this.name); // will be an instance of BS

我真的被困在这里,文档根本没有帮助。

我需要动态组件加载和注入。 Full Plunker可在以下位置找到:Plunker Dynamic Component Loading and Injection

2 个答案:

答案 0 :(得分:5)

首先,您需要创建一个InjectionToken(此处为values.ts):

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

export const PAGE_TITLE = new InjectionToken<string>('page.title');

然后,您需要将其导入模块并在请求该令牌时提供值:

providers: [ HeroService, MessageService,
    { provide: PAGE_TITLE, useValue: "My Wonderful Title" }
],

然后,您需要将该令牌导入要注入值的位置并使用@Inject()

constructor(@Inject(PAGE_TITLE) title) {
  this.title = title;
}

Sample on Stackblitz

查看ReflectiveInjector它说它很慢并且使用Injector.create代替btw ......

答案 1 :(得分:4)

  

get已弃用:从v4.0.0开始使用Type或InjectionToken

警告指的是injector.get是泛型方法并且期望类型参数的事实。这正是Injector documentation所述的内容:

  

get(token:Type | InjectionToken,notFoundValue?:T):T

考虑到name字符串标记应该解析为字符串,它应该是:

this.injector.get<string>(<any>'name');

也不推荐使用字符串标记,并且标记应该是函数或InjectionToken实例。

  

但是我不想使用Value或useClass,我需要的是注入的实际值。

所有依赖项都应注册为模块或组件提供程序,以便注入。