使用子级的Angularfire2过滤数据存在

时间:2018-05-22 14:29:46

标签: angular firebase ionic-framework firebase-realtime-database angularfire2

我的数据类似this。当我需要从问题列表中获取数据时,我需要检查当前用户ID(已登录的用户)是否存在于 answersStudents 中。如果存在,那么问题需要隐藏在用户之外。否则问题将显示在列表中。

我在这里如何得到问题:

getQuizesSeries()
  {
    let ref = this.afDB.list('questions').snapshotChanges()
    .map(changes =>{
      console.log(changes);
      return changes.map(c=> ({key:c.payload.key,...c.payload.val()}));
    });

    return ref;

  }

在我的constructor中,我这样称呼function

  questions:Observable<any[]>;
  quizes:any;

  constructor(public navCtrl: NavController, public afDb:AngularFireDatabase ,public navParams: NavParams,public dataProvider:DataProvider) {
    this.quizes = this.dataProvider.getQuizesSeries();       
  }

这是我的html,其中显示了数据:

<ion-list *ngFor="let quiz of quizes |async;let i = index;" >
    <ion-item (click)="passkey(quiz.key)">
        <p>{{quiz.name}}</p>
    </ion-item>
</ion-list>

2 个答案:

答案 0 :(得分:0)

您将必须获取当前登录的学生的UID。

e.g。

stduentID = //the id of the logged in user here

然后,当您在离子列表中创建问题时,您将获得一个ngIf 使用loggedIn用户uid

检查answersStudents uid
<ion-list *ngFor="let quiz of quizes |async;let i = index;" >
    <ion-item (click)="passkey(quiz.key)" *ngIf="your logic here">
        <p>{{quiz.name}}</p>
    </ion-item>
</ion-list>

答案 1 :(得分:0)

我尝试添加一个带有虚拟数据的简单示例来解决此任务。 您需要使用filter运算符来过滤掉已登录用户已经回答的问题。

在下面的代码中,我正在检查登录用户是否已经回答了这个问题。如果YES然后跳过此问题,请将此问题添加到问题列表中。

let questions = [
  {id: 1, desc: "desc1"},
  {id: 2, desc: "desc2"},
  {id: 3, desc: "desc3"}
];

let answeredStudents = [
  {id: 1, answered: [1]},
  {id: 2, answered: [1, 2]}
];

let loggedUserId = 1;

let questionsObs = Rx.Observable.from(questions);

function hasNotAnswered(id, question) {
  let user;
  answeredStudents.forEach(student => {
    if (student.id === id) {
      user = student;
    }
  });
  return !(user.answered.indexOf(question.id) > -1);
}

questionsObs.filter(question => hasNotAnswered(loggedUserId, question))
  .map(question => questionList.push(question));