组件A的内部构造函数中,我使用以下代码:
public visitors: any[] = [];
this.eventsService.view(this.activatedRoute.snapshot.params['id']).subscribe(response => {
this.event = response.data.event;
this.visitors = response.data.event.visitors;
});
组件模板是:
<app-visitor-component [visitors]="visitors"></app-visitor-component>
为什么visitors
组件中的变量app-visitor-component
为空,尽管存在数据:
@Input() visitors: IVisitor[];
constructor() {
console.log(this.visitors); // returns []
}
答案 0 :(得分:3)
在ComponentA
模板中,如果希望子组件中visitor
的绑定值是visitor
,最简单的操作就是*ngIf
检查。
<app-visitor-component *ngIf="visitors.length" [visitors]="visitors"></app-visitor-component>
这将对visitors.length
的值进行真实检查,直到服务调用返回一个值为止,该值将一直为false
。
我还建议您将服务调用移至eventsService.view
的{{1}}到ngOnInit
并移出构造函数。这也使ComponentA
的测试更加容易。
然后在ComponentA
的子组件中
根据先前的答案@Input() value is always undefined
它将在
app-visitor
中初始化,而不是在构造函数中初始化。 (请同时查看Angular Life Cycle Hooks documentation。)
您使用ngOnInit
OnInit
答案 1 :(得分:1)
角度不会使@Input
数据可用。即constructor()
期间不可用。
如果要在实际发送(并重新发送)@Input
时退出,请使用NgOnChanges:
import { Component, Input, OnChanges } from @angular/core';
@Component({
selector: 'app-foo',
})
export class FooComponent implements OnChanges {
@Input() visitors: IVisitor[];
ngOnChanges() {
if (this.visitors) {
console.log(this.visitors)
// do something with this.visitors
}
}
}
或者,当Angular发送东西时,您也可以使用getter / setter来触发它:
private _visitors: IVisitor[];
@Input() public set visitors(val: IVisitor[]) {
this._visitors = val;
}
// Also, guarantee to always return an array
public get visitors(): IVisitor[] {
if (this._visitors) {
return this._visitors;
}
return [];
}