我有一个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),但是似乎没有任何东西可以触发更改。有什么方法可以设置标志而不实际更改值?
答案 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));
}