Итак, я пытаюсь создать директиву «автозаполнения» для проекта, который будет запрашивать API и отображать список результатов для выбора. У меня есть компонент, который отображает модальное окно с простым полем ввода. Мне нужно ввести текст в поле для поиска участников, щелкнуть элемент и добавить его в массив в компоненте.
Изменить: проблема, с которой я сталкиваюсь, заключается в том, что когда я вызываю this.wlAutocomplete.next(value);
, он возвращается в мой компонент и выполняет вызов API с правильным значением из поля ввода, он не возвращает данные обратно. к директиве для обработки ответа от API там.
Пример StackBlitz: https://stackblitz.com/edit/angular-11erew < / а>
Компонент будет отслеживать массив выбранных элементов. Мне нужно уметь:
- Вызовите мой API в компоненте, чтобы получить данные и вернуться к директиве
- Директиве необходимо будет прочитать данные и отобразить список под полем ввода (здесь я могу сделать HTML).
- Щелчок по элементу списка в раскрывающемся списке отправит этот выбор обратно компоненту для обработки по мере необходимости, например. добавить его в массив.
У моего компонента есть метод:
queryMembers(value: string): Subscription {
return this.memberService.query({ term: value, groupKey: this.group.groupKey })
.subscribe((members) => {
console.log(members);
return this.searchMemberList = members;
});
}
Что я использую в шаблоне вот так:
<input (wlAutocomplete)="queryMembers($event)" class="uk-search-input" type="search" placeholder="Search...">
Вот код Директивы:
@Directive({
selector: 'input[wlAutocomplete]'
})
export class AutocompleteDirective {
modelChanged: Subject<string> = new Subject<string>();
subscription: Subscription;
debounce: number = 500;
constructor() {
this.subscription =
this.modelChanged
.pipe(debounceTime(this.debounce))
.subscribe(value => {
this.wlAutocomplete.next(value); // I need to get the data from component method passed into `wlAutocomplete`
});
}
@Output() wlAutocomplete: EventEmitter<any> = new EventEmitter();
@HostListener('input', ['$event'])
onChange($event) {
this.modelChanged.next($event.target.value);
}
}