Материальная документация должна быть более понятной.В то время как есть различные гимнастические процедуры, которые вы можете сделать для достижения этой функциональности (например, манипулирование объектом документа, использование @ViewChild или создание прослушивателей событий), для меня это сводится к двум следующим способам:
1 Минималист:
<mat-form-field>
<input #nameInput
matInput
formControlName="name"
#trigger="matAutocompleteTrigger"
[matAutocomplete]="autoName">
<mat-autocomplete #autoName="matAutocomplete">
<mat-option *ngFor="let o of suggestionOpts"
[value]="o"
(click)="$event.stopPropagation(); trigger.openPanel()">{{o}}</mat-option>
</mat-autocomplete>
</mat-form-field>
Здесь мы присоединяем директиву MatAutoCompleteTrigger
к входу и присваиваем ее переменной с именем trigger
.Эта директива триггера передается методу click для каждого mat-option
, который срабатывает каждый раз, когда в меню выбирается опция.Директива содержит два соответствующих метода .Здесь мы называем openPanel
.Мы вызываем stopPropagation
для объекта $event
, чтобы собственные методы не делали ничего неожиданного.
2 Явный:
.html
<mat-form-field>
<input #nameInput
matInput
formControlName="name"
#trigger="matAutocompleteTrigger"
[matAutocomplete]="autoName">
<mat-autocomplete #autoName="matAutocomplete">
<mat-option *ngFor="let o of suggestionOpts"
[value]="o"
(click)="selectionMade($event, trigger)">{{o}}</mat-option>
</mat-autocomplete>
</mat-form-field>
.ts
import { MatAutocompleteTrigger } from '@angular/material/autocomplete';
...
selectionMade(ev: Event, trigger: MatAutocompleteTrigger) {
event.stopPropagation();
trigger.openPanel();
}
Здесь мы передаем объект директивы и события функции в файле .ts компонента и выполняем ту же логику, что и в первом подходе.Если общее разделение интересов является проблемой, поступайте так.Для таких небольших работ я предпочитаю минималистский подход, но я полагаю, что каждый свой.