【问题标题】:Angularfire2 filter data using child existsAngularfire2使用子过滤数据存在
【发布时间】:2018-11-01 08:59:35
【问题描述】:

我有像this这样的数据。当我需要从问题列表中获取数据时,我需要检查answeredStudents中是否存在当前用户ID(登录用户)。如果存在,则需要该问题对用户隐藏。否则问题将显示在列表中。

我是如何得到问题的:

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>

【问题讨论】:

  • 有什么问题?
  • @Amarnath 如果当前登录的 uid 存在于被回答的学生中,它需要从列表中隐藏。我该怎么做?
  • 您的密码功能在哪里?在你的问题中

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


【解决方案1】:

您将不得不获取当前登录学生的 UID。

例如

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

然后,当您在 ion-list 中创建问题时,您将有一个 ngIf 使用已登录用户 uid 检查被回答的学生 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>

【讨论】:

  • 实际上我知道我可以有一个 ngIf 并获取数据。我还需要知道如何将逻辑传递到这里
  • 你可以给出存储在一个函数中的逻辑,它返回一个真或假,然后在你的 ngIf 中会有类似 *ngIf="Yourfunction()" 的东西,所以如果函数返回一个真,问题将隐藏
【解决方案2】:

我尝试添加一个带有虚拟数据的简单示例来解决此任务。 您需要使用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));

【讨论】:

  • 这正是我所需要的。但由于我使用的是 firebase,所以很难得到问题 id(keys)。
  • 我认为您不需要创建另一个问题列表,您可以使用 ngIf 来跳过您不想显示的问题,具体取决于 hasNotAnswered() 函数的结果。这样你就可以避免不必要的数组
  • @LVW23 发布 json 结构当您检索 id 时的外观跨度>
  • @PatricioVargas 无论哪种方式.. 在渲染到 DOM 之前过滤它们或在处理响应时过滤它们。
  • @LVW23 这可能很耗时,因为我不知道 Firebase。所以尝试了一个简单的例子。您可以尝试这种方法并让我知道问题,以便我们尝试解决它。​​
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 2021-06-29
  • 2021-01-22
  • 2017-05-27
  • 1970-01-01
相关资源
最近更新 更多