我想在我的构造函数中的组件上设置一个字符串属性,但是当我尝试这样的事情时
@Component({
selector: 'wg-app',
templateUrl: 'templates/html/wg-app.html'
})
export class AppComponent {
constructor(private state:string = 'joining'){
}
}
我得到一个 DI 异常
EXCEPTION: No provider for String! (AppComponent -> String)
很明显,注入(inject)器正在尝试查找“字符串”提供程序,但找不到。
我应该为这类事情使用什么样的模式?例如。将初始参数传递给组件。
应该避免吗?我应该注入(inject)初始字符串吗?
最佳答案
您可以使用 @Input()
属性。
<my-component [state]="'joining'"></my-component>
export class AppComponent {
@Input() state: string;
constructor() {
console.log(this.state) // => undefined
}
ngOnInit() {
console.log(this.state) // => 'joining'
}
}
构造函数通常只用于 DI...
但如果你真的、真的需要它,你可以创建可注入(inject)变量 (plunker) :
let REALLY_IMPORTANT_STRING = new OpaqueToken('REALLY_IMPORTANT_STRING');
bootstrap(AppComponent, [provide(REALLY_IMPORTANT_STRING, { useValue: '!' })])
export class AppComponent {
constructor(@Inject(REALLY_IMPORTANT_STRING) public state: REALLY_IMPORTANT_STRING) {
console.log(this.state) // => !
}
}
最简单的选择是只设置类属性:
export class AppComponent {
private state:string = 'joining';
constructor() {
console.log(this.state) // => joining
}
}
正如@Mark 所指出的,另一种选择是使用服务:
export class AppService {
public state:string = 'joining';
}
export class AppComponent {
constructor(private service: AppService) {
console.log(this.service.state) // => joining
}
}
关于Angular 2 将参数传递给构造函数抛出 DI 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35518141/