我正在使用这种方法来获取数据:
home.service.ts
getHomes(): Observable<HomeApi> {
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/x-www-form-urlencoded',
'token': `${this.global.token}`
})
};
return this.http.get<HomeApi>('url', httpOptions);
}
home.component.ts
ngOnInit() {
this.service.getHomes().subscribe((res: HomeApi) => this.home = {
images: res['images']
});
}
home.component.html
<div *ngFor="let item of home.images">{{item.name}}</div>
现在item.name
可以很好地工作,但是在控制台中会引发以下错误:
错误TypeError:无法读取未定义的属性“图像”
这里是Sample
答案 0 :(得分:4)
由于您的getHomes
调用是异步,因此Angular会尝试在分配home.images
之前呈现其内容。在这种情况发生之后,home.images
被分配到您的代码中,并触发一个更改检测周期,最终使您的*ngFor
成功运行。
处理此问题的一种方法是使用类似以下的内容:
<div *ngIf="home">
<div *ngFor="let item of home.images">{{item.name}}</div>
</div>
这只是确保尝试处理home
之前undefined
不是*ngFor
,这将解决您的控制台错误。
另一种选择是使用safe navigation operator:
Angular安全导航运算符(?。)是一种流畅而便捷的方法,可防止属性路径中的null和undefined值。
这就像将?
添加到home
一样简单:
<div *ngFor="let item of home?.images">{{item.name}}</div>
答案 1 :(得分:1)
您可能尚未初始化home
。所以第一次初始化home是在这里:
this.home = {
images: res['images']
}
直到*ngFor
在home
对象的undefined
对象中寻找项,直到异步请求完成并初始化home
。
尝试在组件顶部初始化home:
例如home: any = {};
Check this piece, which demonstrates what it is probably happening.