我正在尝试将字符串注入到我的角度组件中。 下面的代码工作正常,但它给出了弃用警告: 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
提出类似下面的内容,但我不想useValue
或useClass
,我需要的是注入的实际值。
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
答案 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;
}
查看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,我需要的是注入的实际值。
所有依赖项都应注册为模块或组件提供程序,以便注入。