Принудительное изменение FormControl (без вмешательства пользователя) для запуска наблюдаемого изменения с помощью .distinctUntilChanged - PullRequest
0 голосов
/ 07 января 2019

У меня есть FormControl / сервис, который обновляется при вводе пользовательских типов в поле следующим образом:

  term = new FormControl();
  page = new BehaviorSubject(1);
  ..
  ..
  // Call to search 
  search(this.term.valueChanges, this.page);

  // Search definition
  search(term: Observable<string>, page: BehaviorSubject<number>,  debounceDuration = 400) { 
      return term.debounceTime(debounceDuration)
                .distinctUntilChanged()
                .switchMap(term => this.productSearch(term,page.getValue()));
  }

Это работает, как и ожидалось, поэтому, если пользователь вводит слово «запустить» и через несколько секунд «работает», он запускает вызов для поиска при каждом изменении термина.

Теперь в другом месте у меня есть отдельная функция (часть стороннего компонента). Когда эта функция вызывается, я хочу имитировать, как будто пользователь изменил термин, чтобы повторно вызвать вызов для поиска.

getPage(p: number) {
    this.page.next(p);
    this.term.setValue(this.term.value + " ");
    }

Мне удалось заставить его работать, только заново установив значение термина с дополнительным пробелом (который, конечно, явно добавляет его в пользовательский интерфейс). Я пробовал некоторые другие опции в FormControl (setDirty, setTouched), но, кажется, ничего не вызывает изменения. Есть ли способ установить флаг без изменения значения?

1 Ответ

0 голосов
/ 07 января 2019

Вы можете использовать merge и «объединить» другую Наблюдаемую (в данном случае тему) тему, которая вызывает this.productSearch() после оператора distinctUntilChanged (обратите внимание, что это не будет обновлять поле формы):

private trigger$ = new Subject();

getPage(p: number) {
    this.trigger$.next(this.term.value);
}

search(.....) { 
    return term.debounceTime(debounceDuration)
       .distinctUntilChanged()
       .merge(this.trigger$)
       .switchMap(term => this.productSearch(term,page));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...