我的数据类似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>
答案 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));