AngularFire2: Execute 'Junções' no FirebaseListObservables usando RxJS .map ()
Como mencionado em outra pergunta, estou desenvolvendo um aplicativo Ionic 2 usando o Firebase como back-end.
Eu tenho categorias e tenho produtos. Os produtos pertencem a categorias. Como é um relacionamento "n para m", produtos e categorias são armazenados em nós separados no firebase. Estruturei os dados da seguinte maneira:
Estrutura de dados do Firebase:
As categorias sabem quais produtos pertencem a elas (as chaves são referenciadas no nó "prods" de cada categoria). Os produtos sabem a que categorias eles pertencem (as chaves são referenciadas no nó "prod_cat"). No entanto, quando listo todas as categorias, apenas conheço os IDs dos produtos que pertencem à categoria. No modelo, preciso mostrar mais detalhes, como o nome do produto, por exemplo.
Li muitas perguntas semelhantes e criei esta solução para adicionar as informações do produto às categorias:
getProductsOfCategory(catId){
this.productsOfCategory = this.af.database.list('/categories/'+catId+'/prods');
return this.productsOfCategory
.map(products => {
console.log(products); // works fine: an object containing the relevant product information is logged to the console (see screenshot)
products.map( product => { console.log(product.$key); // works fine: the IDs of the products are logged to the console
product.prod_details = this.af.database.object('/products/'+product.$key); // seems not to work. Returned value: undefined
});
});
Infelizmente, isso não funciona. Conforme escrito como comentários no código, as informações do produto são coletadas corretamente e registradas no console (consulte a captura de tela a seguir):captura de tela do console
No entanto, o objeto retornado da função acima é "indefinido".
Quando tento declarar que explicitamente um objeto do tipo FirebaseListObservable deve ser retornado, recebo o erro:
O tipo 'Observable' não pode ser atribuído ao tipo 'FirebaseListObservable'. A propriedade '$ ref' está ausente no tipo 'Observable'.
Alguém tem uma idéia do que mais eu poderia tentar?
Muito obrigado antecipadamente!