У меня довольно простое автозаполнение с Angular Material (6).Вот базовая реализация:
<mat-form-field>
<input type="text" matInput placeholder="Company" formControlName="company" [matAutocomplete]="autoCo"/>
<mat-autocomplete #autoCo="matAutocomplete" [displayWith]="displayCo">
<mat-option *ngFor="let company of filteredCompanies | async" [value]="company">
{{ company.companyName }}
</mat-option>
</mat-autocomplete>
</mat-form-field>
Это работает без проблем.Тем не менее, я хочу, чтобы что-то произошло, когда выбор сделан.Для этого я добавил (optionSelected)="onSelectionChanged($event)"
к элементу mat-autocomplete
.Изначально все работает как положено (работает фильтрация опций).После выбора функция onSelectionChanged
также срабатывает, как и ожидалось.
Однако после выбора выбранный элемент является единственным элементом, доступным в раскрывающемся меню автозаполнения, независимо от того, какие изменения внесены.Я делаю.Поэтому, даже если я удалю весь текст на входе, я все равно вижу только ранее выбранную опцию.Вместо этого я ожидаю увидеть полный список.
В ngOnInit
у меня есть:
this.filteredCompanies = this.companyForm.get("company").valueChanges.pipe(
debounceTime(200))
.pipe(mergeMap(val => this.filter(val)));
Похоже, что подписка valueChanges
завершится, если я свяжусь с optionSelected
.Если я не привязываюсь к optionSelected
, список параметров обновляется, как и ожидалось.
Неправильно ли я привязан к событию optionSelected
?Нужно ли повторно подписываться на форму valueChanges из onSelectionChanged()
??Если да, то почему?
Для чего это стоит, вот еще какой-то соответствующий код:
@Output()
optionSelected = new EventEmitter();
onSelectionChanged(event: any) {
console.log(event);
this.optionSelected.emit(event);
}