【发布时间】:2020-01-11 07:27:40
【问题描述】:
在我的子组件中,我有两个按钮,如下所示:
child-component.html
<div>
<button (click)="getFirstData()">First</button>
<button (click)="getLastData()" >Last</button>
</div>
在child-component.ts:
export class ChildComponent implements OnInit, AfterViewInit {
firstItem: number;
lastItem: number;
constructor() {
}
ngOnInit() {
}
ngAfterViewInit(): void {
}
getFirstData() {
this.firstItem = 1;
return this.firstItem;
}
getLastData() {
this.lastItem= 10;
return this.lastItem;
}
}
在父组件中,我需要在从子组件调用相应方法后接收firstItem 和lastItem 数据。当我尝试在 AfterViewInit 生命周期钩子中使用 ViewChild 在父组件中获取它时,如下所示:
parent-component.ts
export class ParentComponent implements OnInit, AfterViewInit {
@ViewChild(ChildComponent, {static: true}) child: ChildComponent;
first: number;
last: number;
ngOnInit() {
}
ngAfterViewInit() {
console.log('first value ', this.child.getFirstData());
console.log('last value ', this.child.getLastData());
}
getValues(): void {
// some operations heer
}
}
我无法从孩子那里获取这些数据。
我的目标是在按钮单击事件后在子项中调用方法后接收这些数据。并且收到后需要调用父组件中的getValues()方法。
我怎样才能做到这一点?
【问题讨论】:
-
不要使用 ViewChild。使用输出。 angular.io/guide/…
-
@JBNizet 对于每个输出,我需要分别发出每个事件。假设我有三个或四个方法调用,那么我必须发出三个或四个事件发射器。在子选择器中,我必须声明它们中的每一个。我试图忽略这一点。另一方面,当我使用 ViewChild 时,我可以将整个组件放在一行中。
-
不,你没有。例如,您可以使用单个输出并发出
{ first: 1 }或{ last: 10 }。当然,您也可以始终发出相同的值(例如未定义),然后使用 ViewChild 从子组件获取新状态,但您仍然不知道状态中刚刚发生了什么变化。