我有这个for循环,我检索用户的进度
打字稿:
his.userProgress = af.object('/UserProgress/' + this.currentUser + '/', { preserveSnapshot: true });
this.userProgress.subscribe(snapshots => {
snapshots.forEach(snapshot => {
this.userScores.push(snapshot.val());
});
console.log(this.userScores);
//set this one to i<=8 because total no. of quizzes are 9. which means this.userScores.length -1
for(var i=0; i <= 8; i++){
if (this.userScores.length == i) {
this.scores = [{
None: "Nothing Recorded"
}];
console.log("Nothing");
}
else if (this.userScores.length >= i) {
this.scores = [{
Chapter:this.userScores[i].Chapter_Quiz,
QuizNo:this.userScores[i].Quiz,
Score:this.userScores[i].Score,
}];
console.log("With Scores");
}
}
});
首先,它将检查userScores []长度是否小于或大于等于0.如果该测验没有得分,它将显示“Nothing Recorded”,否则它将显示得分。
HTML:
<ion-card>
<ion-list *ngFor="let score of scores">
<ion-card-header>
{{score.Chapter}}
</ion-card-header>
<button ion-item *ngIf="scores.length < 0">
<ion-icon name="planet" item-start></ion-icon>
{{score.None}}
</button>
<button ion-item *ngIf="scores.length >= 0">
<ion-icon name="planet" item-start></ion-icon>
{{score.Score}}
</button>
</ion-list>
我遇到的问题是它只显示最后一条记录。我做错了什么?
预期产出:
If finished with the 1st quiz:
1st: Score
2nd: Nothing Recorded
3rd: Nothing Recorded
....
if no score at all:
1st: Nothing Recorded
2nd: Nothing Recorded
.....
答案 0 :(得分:1)
首先,在循环的每次迭代中,您正在更改this.scores
变量中的值,而实际上您应该将其推送以存储先前测验中的数据。
改为使用this.scores.push
。
您还可以更改for循环中的条件,并使用i < this.userScores.length
使其依赖于数组的长度。
然后更改html中的ngIf
以检查score.Score
是否存在。如果没有,则没有得分
答案 1 :(得分:0)
好吧,从您的代码看,this.userScores.length = 9
似乎总是大于循环中的索引i
(i
仅从0
到8
不等)。因此,对于每个循环迭代,最后一个块(else if
块)被执行。由于您没有动态更改/添加到this.scores
数组,而只是分配给对象本身(不以某种方式更改this.scores
的数组索引或推送到现有的this.scores
列表),当前迭代中this. userScores[i]
索引的值在每次迭代时都存储到this.scores
。在最后一次迭代时,this.userScores[8]
所拥有的内容将是this.scores
的值,该列表只有length = 1
。
有道理吗?