0

I'm trying to get two objects from firebase and manipulate the data, before it's displayed. Unfortunately I do only get one of the objects but I don't know why.

Here are the code snippets:

page.ts

let item: ItemModel = this.ItemProvider.getItem(itemID);
let itemInfo: ItemInfoModel = this.ItemProvider.getItemInfo(itemID);

provider.ts

item: ItemModel = new ItemModel();
itemInfo: ItemInfoModel = new ItemInfoModel();

  getItem(itemID: string): ItemModel {
    var subscription = this.db.object(`/items/${itemID}`, { preserveSnapshot: true })
      .subscribe(item => {
      let i: ItemModel = item.val();
      this.item = i;
    });
  subscription.unsubscribe();
  return this.item;
  }

  getItemInfo(itemID: string): ItemInfoModel {
    var subscription = this.db.object(`/itemInfo/${itemID}`, { preserveSnapshot: true })
      .subscribe(itemInfo => {
      let i: ItemInfoModel = itemInfo.val();
      this.itemInfo = i;
    });
  subscription.unsubscribe();
  return this.itemInfo;
  }

As you can see both functions are similar but still the getItemInfo doesn't return the value in time.

When I do console.log in page.ts in prints the following

console.log(item); => Object { data... }
console.log(itemInfo); => ItemInfoModel { }

I tried to switch the calls of the functions and get itemInfo first, but it doesn't have any effect.

The structure of my firebase is like this:

- firebase
    - items
        -KIedkI3983ndK
            -name
            -img
            -price
            -actualInfo => KIe3jkdl83dsf
    - itemInfo
        -KIeDjeidl3njd
            -item => KIedkI3983ndK
            -info1
            -info2
        -KIe3jkdl83dsf
            -item => KIedkI3983ndK
            -info1
            -info2

Since I'm still pretty new to this I tried everything I've read here on stackoverflow but didn't find a solution for the problem.

In the subscription of getItemInfo I do have the right value, but it's not written in the global this.itemInfo before the return-statement is called. It's wired that in getItem the exact same code works.

Any ideas?

1 Answers1

0

You need to add a query object on the FirebaseListObservable options. Your 'getItemInfo' funtions should be like this :

getItemInfo(itemID: string): ItemInfoModel {

 var subscription = this.db.list('/itemInfo/', { query: {  orderByChild: 'item',  equalTo: itemID  }})
 .subscribe(itemInfo => {
      let i: ItemInfoModel = itemInfo.val();
      this.itemInfo = i;
    });
  subscription.unsubscribe();
  return this.itemInfo;
}
Soyab Shaikh
  • 144
  • 1
  • 5