Прежде всего, есть проблема с вашей реализацией:
В вашем ExerciseFlashcardPage
вы подписываетесь на Observable
, который развернет его.Но тогда вы также используете в своем шаблоне канал async
, который будет ожидать Promise
или Observable
.
Просто удалите строку подписки из своего кода:
// Remove this part
this.questions.subscribe(e => {
console.log(e); // how to access the data //only returns an array of object
});
Таким образом, вам также не придется беспокоиться о том, чтобы вручную отписаться от подписки, когда этот компонент уничтожен.
РЕШЕНИЕ:
Теперь для вашего конкретного варианта использования это не так.Неважно, как вы справляетесь с подпиской.Все, что вам нужно, это показать один вопрос за один раз.Для этого вы можете просто сохранить свойство currentQuestion
в классе компонентов, а затем использовать *ngFor
вместе с [ngClass]
А затем, когда пользователь отправляет один вопрос, вы можете увеличивать свойство currentQuestion
на 1.
В коде это будет выглядеть примерно так:
import { map } from 'rxjs/operators';
export class ExerciseFlashcardPage {
questions: Observable < any > ;
type: string;
constructor(
public navCtrl: NavController,
public navParams: NavParams,
public afd: AngularFireDatabase
) { }
ngOnInit() {
this.type = this.navParams.get('data');
this.questions = this.afd.list('exercises/' + this.type).valueChanges()
// The below Pipe operation is not required if you don't plan to change the data-model of the question object.
.pipe(map(questions => {
return questions.map(question => {
return {
...question,
yourNewKeyHere: 'Value to that new key here'
}
});
}));
}
submitCurrentQuestion() {
// Make changes to save the answer
++this.currentQuestion;
}
}
И в шаблоне:
<ion-header>
<ion-navbar>
<ion-title>exercise-flashcard</ion-title>
</ion-navbar>
</ion-header>
<ion-content padding>
<ion-list>
<ion-item
*ngFor="let item of questions | async; let i = index;"
[ngClass]="(i === currentQuestion) ? '': 'hide'">
{{item.question}}
</ion-item>
</ion-list>
</ion-content>
CSS:
.hide {
display: none;
}
Вот Образец StackBlitz для вашей ссылки.