angular child 在接收到 parent 数据之前渲染
angular child rendering before parent data is received
我有一个 parent 组件 (app.component) 发出 http 请求,将结果分配为 this.stats 然后将其作为道具传递给 child (progression.component).我的问题似乎是我的 child 在从 parent 获取任何数据之前正在渲染,导致 child 抛出错误并中断。
即我得到 -> {}
[[Prototype]]: Object 当我在我的 child 组件中记录道具时
我只是没有经验,但由于我所有的组件都使用 ngOnInit() 并订阅了可观察对象,我认为 child 应该等待 parent 完成?我不确定我该如何解决这样的问题,因为它存在于各个组件中,并且不是我可以合并我认为的可观察对象的情况……任何见解都会很棒 :) 谢谢!
parent分量
export class AppComponent {
title = 'pctothemoon';
stats: any
constructor(private specsService: SpecsService) {}
ngOnInit(): void {
this.specsService.getStats().subscribe((res)=>{this.stats=res})
}
}
child分量
export class ProgressionComponent {
@Input() stats: any;
oldStats: any;
constructor(private specsService: SpecsService) { }
ngOnInit(): void {
this.specsService.getProgress().subscribe((res)=>{console.log(res)})
}
AfterViewInit(){
this.specsService.postUpdates(this.stats).subscribe((res)=>{console.log("updated stats", res)})
}
}
作为参考,我还将包含我的 service.ts 以在后台显示我的 http 请求
export class SpecsService {
private apiUrl = 'http://localhost:3000'
constructor(private http:HttpClient) {}
getStats():Observable<any>{
return this.http.get(`http://localhost:8888/fetchStats`)
}
postUpdates(stats):Observable<Object>{
//send stats to json server store
const url = `${this.apiUrl}/progressionData`; //json server collection location
return this.http.post(url,stats,httpOptions) + stats
}
getProgress(){
return this.http.get(`${this.apiUrl}/progressionData`)
}
}
答案很简单。只需将 child 组件包装在 HTML:
中的 *ngIf 中
<ng-container *ngIf="!!stats">
<app-child-component [stats]="stats"></app-child-component>
</ng-container>
条件是 child 需要的数据可用。这里,child组件只有在数据可用后才会被创建。
我有一个 parent 组件 (app.component) 发出 http 请求,将结果分配为 this.stats 然后将其作为道具传递给 child (progression.component).我的问题似乎是我的 child 在从 parent 获取任何数据之前正在渲染,导致 child 抛出错误并中断。
即我得到 -> {} [[Prototype]]: Object 当我在我的 child 组件中记录道具时
我只是没有经验,但由于我所有的组件都使用 ngOnInit() 并订阅了可观察对象,我认为 child 应该等待 parent 完成?我不确定我该如何解决这样的问题,因为它存在于各个组件中,并且不是我可以合并我认为的可观察对象的情况……任何见解都会很棒 :) 谢谢!
parent分量
export class AppComponent {
title = 'pctothemoon';
stats: any
constructor(private specsService: SpecsService) {}
ngOnInit(): void {
this.specsService.getStats().subscribe((res)=>{this.stats=res})
}
}
child分量
export class ProgressionComponent {
@Input() stats: any;
oldStats: any;
constructor(private specsService: SpecsService) { }
ngOnInit(): void {
this.specsService.getProgress().subscribe((res)=>{console.log(res)})
}
AfterViewInit(){
this.specsService.postUpdates(this.stats).subscribe((res)=>{console.log("updated stats", res)})
}
}
作为参考,我还将包含我的 service.ts 以在后台显示我的 http 请求
export class SpecsService {
private apiUrl = 'http://localhost:3000'
constructor(private http:HttpClient) {}
getStats():Observable<any>{
return this.http.get(`http://localhost:8888/fetchStats`)
}
postUpdates(stats):Observable<Object>{
//send stats to json server store
const url = `${this.apiUrl}/progressionData`; //json server collection location
return this.http.post(url,stats,httpOptions) + stats
}
getProgress(){
return this.http.get(`${this.apiUrl}/progressionData`)
}
}
答案很简单。只需将 child 组件包装在 HTML:
中的 *ngIf 中<ng-container *ngIf="!!stats">
<app-child-component [stats]="stats"></app-child-component>
</ng-container>
条件是 child 需要的数据可用。这里,child组件只有在数据可用后才会被创建。