FromEvent от rxjs не работает должным образом

Я создал компонент с функцией поиска, который вызывает API и отображает данные на странице. Как только я получаю результаты поиска, я сохраняю их в localStorage, чтобы восстановить данные, как только вы вернетесь на ту же страницу компонента поиска. Все работает нормально, пока я не назначу сохраненные данные свойству наблюдаемого результата formEvent this.searchResult$ . Проблема в том, что fromEvent больше не срабатывает, когда я возвращаюсь на ту же страницу по другим маршрутам.

  ngOnInit() {
 const searchEvent$ = fromEvent<any>(this.inputSearch.nativeElement, 'keyup').pipe(tap(() => { console.info('working'); }));
    this.searchResult$ = searchEvent$
      .pipe(
        tap(() => { this.isDataOn = true }),
        map(event => event.target.value),
        filter(value => value ? true : false),
        switchMap(search => this.notesService.onSearchNotes(search)))
      )
 if (!this.isDataOn) {
      this.refreshData()
    }
}
refreshData() {
    if (localStorage.getItem("queryStack")) {
      const data = JSON.parse(localStorage.getItem("queryStack") || "[]");
      console.info(data);
      this.searchResult$ = of(data);
    }
  }

Вы заменяете searchResult$ другой наблюдаемой на of(data). Так что он не собирается излучать что-либо еще после этого.

Reactgular 28.05.2019 22:32

Скажите, пожалуйста, как разместить восстановленные данные, чтобы они отражались в шаблоне с тем же асинхронным каналом?

Rohit Sharma 28.05.2019 22:37

Я не хочу вызывать http для предыдущих результатов поиска.

Rohit Sharma 28.05.2019 22:39
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
3
973
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте следующий подход, который объединяет любые сохраненные данные, которые у вас есть в локальном хранилище, с результатами, полученными с сервера в ответ на события keyup.

// in your imports
import { merge } from 'rxjs';

ngOnInit() {
    const searchEvent$ = fromEvent<any>(this.inputSearch.nativeElement, 'keyup').pipe(tap(() => { console.info('working'); }));
    this.searchResult$ = merge(
        of(this.getSavedData()),
        searchEvent$
            .pipe(
                map(event => event.target.value),
                filter(Boolean),
                debounceTime(1000),
                distinctUntilChanged(),
                switchMap(search => this.notesService.onSearchNotes(search))
            )
    );
}
getSavedData() {
    const localStorageValue = localStorage.getItem("queryStack") || "[]";
    try {
        return JSON.parse(localStorageValue);
    } catch (ex) {
        console.error('Error parsing JSON:', ex);
        return [];
    }
}

Большое спасибо за вашу помощь @GregL, ваше решение такое элегантное и действительно сработало для меня.

Rohit Sharma 29.05.2019 18:55

Другие вопросы по теме