У меня есть массив, который заполняется после .subscribe
для моего API. Консоль показывает, что он заполнен, как и ожидалось. Доступ к элементу массива приводит к ошибке, возникшей из-за того, что он не определен
<div *ngIf="!invoices || invoices.length === 0">
No invoices
</div>
<div *ngIf="invoices || async ">
{{ invoices[0]?.invoice_id || async}}
</div>
Если я удалю оператор elvis, мой контент будет нормально загружаться, однако консоль будет выдавать ошибки InvoicesComponent.html:10 ERROR TypeError: Cannot read property 'invoice_id' of undefined
, пока массив не будет заполнен функцией подписки.
Массив счетов инициализируется в моем сервисе
invoices: Array<Invoice> = [];
И я заполняю массив
getInvoices(){
var _invoices = this.invoices;
if(this.afAuth.user){
// users/uid/invoices/invoice_id/
var userRef = this.afs.doc(`users/${this.afAuth.auth.currentUser.uid}`)
userRef.collection('invoices').get().subscribe(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
// doc.data() is never undefined for query doc snapshots
console.log(doc.id, " => ", doc.data());
_invoices.push({
'invoice_id': doc.id,
'customer_company': doc.data().customer_company,
'year_id':doc.data().year_id,
'date_created': doc.data().date_created,
'date_modified': doc.data().date_modified})
});
console.log(_invoices)
});
return _invoices
}
По предложению Тричетриче был создан класс Invoice
import { QueryDocumentSnapshot } from "@angular/fire/firestore";
import { of } from 'rxjs'
export class Invoice {
invoice_id: string;
customer_company: string;
date_created: string;
date_modified: string;
year_id: string;
constructor(invoiceDoc: QueryDocumentSnapshot<any>){
this.invoice_id = invoiceDoc.id
this.customer_company = invoiceDoc.data().customer_company
this.date_created = invoiceDoc.data().date_created
this.date_modified = invoiceDoc.data().date_modified
this.year_id = invoiceDoc.data().year_id
}
toObservable(){
return of(this)
}
}