Reputation: 946
I have an Object which makes up the content of my nav. The object is obtained with a get() request, which sits inside the ngOnInit() function of the navigation component. With the following code, the navigation functions appears to work fine:
this.httpClient.get(this.url).pipe(map(res => res)).subscribe(res => this.menu = res);
However the console is displaying an error:
ERROR TypeError: Cannot read property 'undefined' of undefined
The error references a line in the associated HTML: *ngIf="menu[category]"
but I guess for a fraction of a second, and at the point in time the HTML is rendered, the menu object does not exist so I see this error. Am I doing something wrong here? I must be.
Upvotes: 0
Views: 1039
Reputation: 31125
You're right. The template renders before the menu
property is initialized and so it throws an error.
There are multiple ways to solve this.
*ngIf
check.<ng-container *ngIf="!!menu">
<div *ngIf="menu?.category">
...
</div>
</ng-container>
<div *ngIf="menu?.category">
...
</div>
async
pipe. This would also remove the overhead of handling a subscription in the controller.Controller (*.ts)
export class SomeComponent implements OnInit {
menu$: Observable<any>;
ngOnInit() {
this.menu$ = this.httpClient.get(this.url);
}
}
Template (*.html)
<ng-container *ngIf="(menu$ | async) as menu">
<div *ngIf="menu.category">
...
</div>
</ng-container>
Upvotes: 2