Búsqueda de sitios web

angular - No se puede usar la interfaz con AngularFirebase


Mientras intentaba crear un carrito de compras en Angular, me he encontrado con problemas de tipo relacionados con mis componentes y servicios. Mi servicio actualmente devuelve AngularFireList<{}> y aunque puedo cambiar su tipo, hacerlo tiene efectos secundarios en otros métodos y dentro de mi componente. Me pregunto si hay una manera eficiente de permitir que mi interfaz actual se convierta en el tipo.

He intentado convertir el tipo a Observable<ProdInterface>, lo cual, de nuevo, resuelve un problema mientras genera otro.

Mi interfaz actual es:

export interface ProdInterface {
    $key:string;
    color_way: string;
    name: string;
    id: number;
    description: string;
    photo:string;
    price:number;
    qty:number;
}

Estoy buscando implementar este método para poder conservar la $key, lo que me permitirá encontrar un elemento en mi base de datos de Firebase:

  async addToCart(product: ProdInterface){
    let cartId = await this.getOrCreateCart();
    let item$ = this.getItem(cartId, product.$key);
    item$.snapshotChanges().pipe(take(1)).subscribe(item => {
       item$.update({ product: product, 
                      quantity: (item.payload.exportVal().quantity || 0) + 1 });
    });
}

Obtener todos mis productos de mi base de datos de Firebase devuelve un tipo Observable<{}> que no tiene el atributo $key que necesito para mi método addToCart

  getAll(){
    return this.db.list('/products').valueChanges();
  }
}

Lo que entonces significa que al usar el método se devuelve el tipo incorrecto:

   this.products$ =  this.productService.getAll();

Mi objetivo final es que pueda mapear el tipo devuelto actual de getAll() a mi ProdInterface para que luego pueda usarlo dentro de mi método addToCart.

Agradecería cualquier orientación en la dirección correcta.

¡Gracias!

Respuesta #1

Con el ejemplo de la documentación de Firebase podrías probar esto:

this.product$ = db.ref("products").orderByKey()
                  .once("value")
                  .pipe(
                  .map(snapshot => {
                      snapshot.forEach(childSnapshot) {
                      var key = childSnapshot.key
                      var childData = childSnapshot.val()
                      return {key, ...childData} 
                      }
                   }));