Где находится слушатель / триггер для Observable в примере поиска - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь следовать примеру кода в Angular "Tour-of-Heroes-Tutorial", в частности, в разделе о настройке реализации для функции поиска.

Насколько я понимаю, функция pipe () RxJS возвращает цепочку функций, которые при запуске будут выполняться.В приведенном ниже случае функция pipe () находится в ngOnInithero-search.component.ts) и возвращает функции, которые при выполнении возвращают Observables.Таким образом, heroes$ Observable (в hero-search.component.html и hero-search.component.ts) будет содержать функции, которые при срабатывании возвращают Hero (s) Observable (s).Что я не понимаю, так это: когда именно сработают функции в heroes$?Другими словами, что такое прослушиватель событий в этом случае и где этот слушатель связан с heroes$?

Я вижу следующее:
1. Вход в hero-search.component.html привязан к методу search() в HeroSearchComponent.
2. Метод search() выдвигает новый поисковый терминв объект searchTerms (наблюдаемый поток).

Как именно все это находит путь к heroes$ и вызывает выполнение функций в heroes$?

Заранее большое спасибо!

(hero-search.component.ts)

export class HeroSearchComponent implements OnInit {
  heroes$: Observable<Hero[]>;
  private searchTerms = new Subject<string>();

  constructor(private heroService: HeroService) {}

  // Push a search term into the observable stream.
  search(term: string): void {
    this.searchTerms.next(term);
  }

  ngOnInit(): void {
    this.heroes$ = this.searchTerms.pipe(
      // wait 300ms after each keystroke before considering the term
      debounceTime(300),

      // ignore new term if same as previous term
      distinctUntilChanged(),

      // switch to new search observable each time the term changes
      switchMap((term: string) => this.heroService.searchHeroes(term)),
    );
  }
}

(hero-search.component.html)

<div id="search-component">
    <h4>Hero Search</h4>

    <input #searchBox id="search-box" (input)="search(searchBox.value)" />

    <ul class="search-result">
        <li *ngFor="let hero of heroes$ | async" >
            <a routerLink="/detail/{{hero.id}}">
                {{hero.name}}
            </a>
        </li>
    </ul>


</div>

(из hero.service.ts)

    searchHeroes(term: string): Observable<Hero[]>{
        if (!term.trim()) {
            return of([]);
        } 
        return this.http.get<Hero[]>(`${this.heroesUrl}/?name=${term}`).pipe(
            tap(_ => this.log(`found heroes matching "${term}"`)),
            catchError(this.handleError<Hero[]>('searchHeroes',[]))
        );
    }
}

1 Ответ

0 голосов
/ 08 февраля 2019

Поскольку вы использовали канал | async в своем коде, он автоматически подписывается на наблюдаемое, и это вызывает, так сказать, события к выполнению.

См .: [https://angular.io/api/common/AsyncPipe]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...