#angular #ionic-framework
#angular #ionic-framework
Вопрос:
я создал диалоговое окно, в котором пользователь может выбрать свои интересы. Если пользователь нажимает на один из чипов, этот метод запускается:
handleClick(tag){
let found = false;
let index = -1;
// tslint:disable-next-line:prefer-for-of
for (let i = 0; i < this.selectedTags.length; i ) {
if (this.selectedTags[i].name_de === tag.name_de) {
index = i;
found = true;
break;
}
}
if (!found) {
this.selectedTags.push(tag);
}else{
this.selectedTags.splice(index, 1);
}
}
Если тег добавлен в selectedTags, на чипах должна отображаться галочка. Это работает нормально, но если пользователь покинул диалоговое окно и снова открыл диалоговое окно, также должен быть показан предыдущий выбор. Для этого я отправляю массив в свой диалог таким образом:
const dialogRef = this.dialog.open(SelectTagsDialogComponent, {
width: '80%',
data: {scope: 'tags',
tags: this.selectedTags}
});
dialogRef.afterClosed().subscribe(result => {
console.log('The dialog was closed', result);
if (result){
this.selectedTags = resu<
}
});
В моем диалоговом окне я проверяю это следующим образом:
getData(){
let updateRef = this.afs.collection('tags');
if (this.data.scope === 'intolerances'){
updateRef = this.afs.collection('intolerations');
}else if (this.data.scope === 'preferences'){
updateRef = this.afs.collection('preferences');
}
updateRef.valueChanges().subscribe(data => {
this.tags = data;
this.filteredTags = this.tags;
if (this.data.tags){
this.selectedTags = this.data.tags;
}
});
}
проблема в том, что маркер не отображается, но внутри моего массива есть несколько тегов. Чтобы проверить, находится ли тег в selectedTags, я создал этот ngIf:
<ion-chip outline color="primary" *ngFor="let tag of filteredTags" (click)="handleClick(tag)">
<ion-icon *ngIf="this.selectedTags.includes(tag)" name="checkmark-circle"></ion-icon>
<ion-label>{{tag.name_de}}</ion-label>
</ion-chip>
Я на самом деле не знаю, почему он работает с прямым взаимодействием и почему он не работает, если теги выбраны ранее.
Спасибо
Комментарии:
1.
updateRef.valueChanges()
даже вызывается?2. @aycanadal да, я получаю все теги хорошими
Ответ №1:
updateRef.valueChanges().subscribe(data => {
this.tags = data;
this.filteredTags = this.tags;
if (this.data.tags){
this.selectedTags = this.data.tags;
}
});
должно быть до
let updateRef = this.afs.collection('tags');
if (this.data.scope === 'intolerances'){
updateRef = this.afs.collection('intolerations');
}else if (this.data.scope === 'preferences'){
updateRef = this.afs.collection('preferences');
}
Комментарии:
1. но если я поставлю это раньше, я не получу правильный путь для нужных мне документов
Ответ №2:
я понял, что не могу использовать includes, потому что он не ссылается на один и тот же объект. Поэтому я изменил способ проверки на это:
private compareWithCheckedOptions() {
this.filteredTags.forEach(tag => {
if (this.selectedTags.some((item) => item.name_de === tag.name_de)) {
tag.checked = true;
}
});
}
Этот метод будет вызываться при каждой загрузке
В моем html я проверяю следующее:
<ion-icon *ngIf="tag.checked" name="checkmark-circle"></ion-icon>