What I'm using
What I'm trying to do
Issue
Question
Component TS
getIssueImages() {
this.albumsCollection = this.afs.collection<any>(/albums/${albumId}/images`);
this.albums = this.albumsCollection.snapshotChanges().map(actions => {
return actions.map(a => {
const data = a.payload.doc.data();
const id = a.payload.doc.id;
console.log(data);
// Firebase Reference
var storage = firebase.storage();
// Get the image storage reference
var image = data.image_thumbnail;
//Create an image reference to the storage location
var imagePathReference = storage.ref().child(image);
// Get the download URL and set the local variable to the result (url)
imagePathReference.getDownloadURL().then((url) => {
this.image_thumbnail = url;
});
return { id, ...data };
});
});
}
Component.HTML
<ul>
<li *ngFor="let image of images | async">
{{ image.image_thumbnail }}
</li>
</ul>
**Component.HTML - Incorrect **
<ul>
<li *ngFor="let image of images | async">
{{ image_thumbnail }}
</li>
</ul>
UPDATE Image update based on @James Daniels response.
The main problem that you are facing is the async nature of getting the download URL. You can solve that with an Observable.fromPromise
.
getIssueImages() {
this.albumsCollection = this.afs.collection<any>(/albums/${albumId}/images`);
this.albums = this.albumsCollection.snapshotChanges().map(actions => {
return actions.map(a => {
const data = a.payload.doc.data();
const id = a.payload.doc.id;
// Firebase Reference
var storage = firebase.storage();
// Get the image storage reference
var image = data.image_thumbnail;
//Create an image reference to the storage location
var imagePathReference = storage.ref().child(image);
// Get the download URL and set the local variable to the result (url)
var image_thumbnail = Observable.fromPromise(imagePathReference.getDownloadURL());
return { id, image_thumbnail, ...data };
});
});
}
Now image_thumbnail
is async.
<ul>
<li *ngFor="let image of images | async">
{{ image.image_thumbnail | async }}
</li>
</ul>