> Как реализовать обработку ввода пользователя в поисковую строку в Angular с использованием реактивных форм (Angular)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: ВСК
Стек: Angular
> Пример ответа
Для обработки ввода пользователя в поисковую строку с реактивными формами в Angular создайте FormControl и подпишитесь на его изменения через valueChanges. Вот полный пример:
Компонент (search.component.ts):
TYPESCRIPTimport { Component, OnInit } from '@angular/core';import { FormControl } from '@angular/forms';import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators';import { SearchService } from './search.service';@Component({selector: 'app-search',templateUrl: './search.component.html'})export class SearchComponent implements OnInit {searchControl = new FormControl('');results$ = this.searchControl.valueChanges.pipe(debounceTime(300), // задержка 300 мс после последнего вводаdistinctUntilChanged(), // игнорировать повторяющиеся значенияswitchMap(query => this.searchService.search(query)) // отмена предыдущего запроса);constructor(private searchService: SearchService) {}ngOnInit() {// Дополнительно: подписка для логирования или побочных эффектовthis.searchControl.valueChanges.subscribe(value => {console.log('Текущий запрос:', value);});}}
Шаблон (search.component.html):
HTML<input [formControl]="searchControl" placeholder="Поиск..."><div *ngIf="results$ | async as results"><div *ngFor="let item of results">{{ item.name }}</div></div>
Сервис (search.service.ts):
TYPESCRIPTimport { Injectable } from '@angular/core';import { HttpClient } from '@angular/common/http';import { Observable } from 'rxjs';@Injectable({ providedIn: 'root' })export class SearchService {constructor(private http: HttpClient) {}search(query: string): Observable<any[]> {return this.http.get<any[]>(`/api/search?q=${query}`);}}
Ключевые моменты:
debounceTime(300)предотвращает частые запросы при быстром вводе.distinctUntilChanged()не отправляет запрос, если значение не изменилось.switchMapавтоматически отменяет предыдущий запрос при новом вводе.- Используйте
asyncпайп в шаблоне для автоматической подписки/отписки.
Для простых случаев без HTTP можно использовать filter и tap для локальной фильтрации данных.
> Похожие задачи по frontend
Как работает useState в Next.js и является ли состояние глобальным или локальным для страницы
Будет ли middleware блокировать показ страницы пока useSWR не отработает
Насколько комфортно работать с Angular и React при переходе с Angular на React
Что будет, если передать в React diff div без key
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью