ngFor needs to see an iterable of `contacts' (as already stated by @martin), which also means it needs to know the extent of what it's iterating, i.e how many items are you intending to display.
The simplest way forward is to add another property which uses the toArray()
operator to the component, and use that in the template.
template
<div *ngFor="let contact of contactsList | async">
From contactsList: {{contact}}
</div>
component
contactsList = this.contacts.toArray();
However, if you want to display something before contacts observable completes (i.e add to ngFor with each contact emitted), you need a buffering observable.
private buffer = [];
contactsList = Observable.of(this.buffer);
ngOnInit() {
this.contacts.subscribe(contact => {
this.buffer.push(contact)
})
}
Demo: StackBlitz