ОБНОВЛЕНИЕ:
Хотя ответ Челлаппана работает, но он не подходит, если вы хотите передать выбранное событие в другой компонент. Вы можете видеть, что из-за (ngModelChange)
, onItemSelect
будет срабатывать при каждом изменении searchStr
, а с ng2-completer
вы можете изменить [(ngModel)]
, наведя курсор на элемент из выпадающего списка. Это очень раздражает, потому что нет никакого свойства, чтобы отключить его.
Другое решение - переопределить событие click
для каждого .completer-row
.
. Файл html
может выглядеть примерно так
<div class="applicant-search-field" #autoComplete>
<ng2-completer
ngDefaultControl
[(ngModel)]="searchValue"
[datasource]="dataSource"
[minSearchLength]="minSearchLength"
[maxChars]="33"
[placeholder]="placeHolder"
(keyup)="onKeyUp($event)">
</ng2-completer>
</div>
и прослушайте key event
, чтобы переопределить прослушиватель событий click
(поскольку раскрывающийся список будет отображаться только в том случае, если вы вводите что-то для поиска).
@ViewChild('autoComplete', { static: false }) child: ElementRef;
onKeyUp(event: any): void {
this.overrideNg2CompleterOnSelected();
this.hasValue = this.searchValue.length > 0;
this.valueBeforeHoverOnItem = this.searchValue;
if (event.key === 'Enter') {
this.autocompleteEventNotifier.emitData(this.searchValue);
}
}
private overrideNg2CompleterOnSelected(): void {
// we have to do this manually because (selected) event of ng2-completer is broken.
const dropDownRows = this.child.nativeElement.querySelectorAll('.completer-row') as HTMLElement[];
if (dropDownRows !== null) {
for (const row of dropDownRows) {
row.addEventListener('click', this.onItemSelect.bind(this));
}
}
}
Это просто обходной путь, я до сих пор не Если вы не хотите применять его, если выпадающий список содержит много элементов, мы можем столкнуться с проблемой производительности.