Я использую элемент Autocomplete с угловым материалом как панель поиска. Строка поиска ведет себя довольно типично - пользователь вводит свой запрос, нажимает Enter, и поиск запускается.
Однако, если пользователь выбирает предложение из автозаполнения (например, "битон" или "beck" на изображении ниже), я бы хотел, чтобы поиск не запускался.
Как определить, было ли нажатие клавиши Enter результатом выбора пользователем варианта автозаполнения или если пользователь запускал поиск?
Оба случая вызывают мою функцию onSearchKeydown
:
// my.controller.ts
public async onSearchKeydown($event: KeyboardEvent) {
if ($event.which === Key.Enter) {
const results = await this.search(this.query);
}
}
Здесь соответствующая часть моего компонента HTML:
<!-- my.component.html -->
<mat-form-field>
<input matInput
autofocus
[(ngModel)]="query"
(keydown)="onSearchKeydown($event)"
[matAutocomplete]="auto">
<mat-autocomplete #auto="matAutocomplete">
<mat-option *ngFor="let s of suggestions">
<span>{{s.value}}</span>
</mat-option>
</mat-autocomplete>
</mat-form-field>
Вам действительно нужно знать, является ли значение "запроса" выбранным. И вы можете сделать это в функции onSearchKeydown перед вызовом поиска. Что-то вроде:
public async onSearchKeydown($event: KeyboardEvent) {
if ($event.which === Key.Enter) {
if (!this.suggestions.some(item => {
return item.value === this.query;
})) {
const results = await this.search(this.query);
}
}
}
Вы также можете использовать трюк. Если ваше значение параметра - это класс или объект, вы можете проверить, совпадает ли значение модели с строкой, которая указывает на типизированный текст:
public async onSearchKeydown($event: KeyboardEvent) {
if ($event.which === Key.Enter) {
if (typeof this.query == 'string') {
const results = await this.search(this.query);
}
}
}
suggestions = [
{ value: 'Apple' },
{ value: 'Banana' },
{ value: 'Cherry' }
];
displaySuggestion(suggestion) {
return suggestion ? suggestion.value : '';
}
<mat-autocomplete #auto="matAutocomplete" [displayWith]="displaySuggestion">
<mat-option *ngFor="let s of suggestions" [value]="s">
<span>{{s.value}}</span>
</mat-option>
</mat-autocomplete>
Также - если вы связываетесь с (keyup.enter)
вместо (keydown)
вам не нужно проверять ключ.
Вы можете проверить, имеет ли какой-либо из предложений автозаполнения класс mat-active. Если да, то это было вызвано выбором варианта автозаполнения.