首页 文章

将嵌套数据从firebase显示为离子数据

提问于
浏览
2

我试图将Firebase中的嵌套数据显示给Ionic项目 . 我在firebase中有以下数据结构:

enter image description here

我的查询:

let dbRefLists = firebase.database().ref('lists/');
var self = this; 
dbRefLists.on('value', (querySnapshot) => {
    this.lists = Object.keys(querySnapshot.val()).map(key => querySnapshot.val()[key]);
    querySnapshot.forEach((data) => {
      var listItem = data.val().id;
      dbRefLists.child(`${listItem}/listItems`).on('value', (snapshotVal) => {
        if (snapshotVal.val() !== null) {
          self.lists.listItems = Object.keys(snapshotVal.val()).map(key => snapshotVal.val()[key]);
        }
      })
      return self.lists.listItems;
    })
    return lists;
});

我的HTML:

<ul>
  <li *ngFor="let list of lists; let i=index" text-wrap (click)="toggleGroup(i)" [ngClass]="{active: isGroupShown(i)}">
    <h2>
      <span>{{list.title}}</span> 
    </h2>
    <ul *ngIf="isGroupShown(i)">
      <li *ngFor="let listItem of lists.listItems">
        <span>{{listItem.title}}</span> 
      </li>
    </ul>
  </li>
</ul>

结果是我收到了所有列表(List1和List2)中的列表项,而不是仅在List1中:

enter image description here

我的错误在哪里?谢谢

1 回答

  • 2

    如果您像这样展平数据库结构:

    database structure

    排队将变得更加容易 . 首先让我创建类,它们将位于Firebase服务文件中,如下所示:

    export class myList {
      listId: string
      elClass: string;
      title: string;
      items?: myItem[];
    
      constructor(listId: string,elClass: string,title: string, items?: myItem[]){
        this.listId=listId;
        this.elClass=elClass;
        this.title=title;
        if(items){
          this.items = items;
        }
      }
    }
    
    export class myItem {
      listId: string;
      title: string;
    
      constructor(listId: string,title: string){
        this.listId=listId;
        this.title=title;
      }
    }
    

    获取数据:

    data: myList[] = [];
    
    onGetListsWithItems(){
      let ref = firebase.database().ref('/');
    
      ref.child('lists/').on('child_added', (snapshot)=>{
        let list: myList = new myList(snapshot.key, snapshot.val().elClass, snapshot.val().title);
        let items: myItem[] = [];
        let listId = snapshot.key;
        ref.child('listItems/')
          .orderByChild('listId')
          .equalTo(listId)
          .on('child_added', (item)=>{
            items.push(new myItem(item.val().listId, item.val().title));
          });
        list.items = items;
        this.data.push(list);
      });
    }
    

    这将为您提供(console.log数据):

    [myList, myList]
    0:{
      elClass:"inActive",
      listId:"randomlistId1",
      title:"List1",
      items: {
        0:{
          listId:"randomlistId1",
          title:"Item2"},
        1:{
          listId:"randomlistId1",
          title:"Item1"}
    },
    1:{
      elClass:"inActive",
      listId:"randomlistId2",
      title:"List2",
      items:{ 
        0:{
          listId:"randomlistId2",
          title:"Item2"}
    }
    

    最后你可以用HTML显示它:

    <ul>
      <li *ngFor="let list of data">
        <h3>{{list.title}}</h3>
        <ul>
          <li *ngFor="let item of list.items">
            <p>{{item.title}}</p>
          </li>
        </ul>
      </li>
    </ul>
    

    结果如下:

    printed result

    如果您对代码有任何意见或者您有任何疑问,请告诉我 .

    附:你可以在这里阅读关于平铺数据库new docs和这里old docs

相关问题