强制FormControl更改(无需用户干预)以.distinctUntilChanged触发可观察的更改

时间:2019-01-07 16:10:39

标签: angular rxjs

我有一个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 + " ");
    }

我只能通过用额外的空间(当然,将其显式添加到UI中)重新设置术语值来使其工作。我已经尝试了FormControl中的其他一些选项(setDirty,setTouched),但是似乎没有任何东西可以触发更改。有什么方法可以设置标志而不实际更改值?

1 个答案:

答案 0 :(得分:3)

您可以使用merge并将另一个Observable(在这种情况下为主题)“合并”到在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));
}