【发布时间】:2018-08-24 03:40:51
【问题描述】:
rxjs 对我来说非常具有挑战性,我发现自己一直在努力解决这个问题。我在堆栈上找到的最接近的解决方案是使用合并运算符。这是link
我正在使用 Angular 2。
我在 html 中有一个输入搜索字段
<input (keydown.enter)="setFocus()" id="search-box" name="input-box" class="search-box" type="text" placeholder="Client search" (focus)="clearWarnings()" />
用户在字段框中输入,将在预设延迟后触发相应的功能。用户也可以按下回车键(和搜索图标)来触发搜索。我的目标是每当用户按下回车键时,去抖不应该触发搜索,因为它已经在运行了。
这是迄今为止使用合并功能的代码,尽管它似乎不像我想要的那样工作。
ngAfterViewInit() {
this.currentMember = this.appHelpersService.getLocalStorageSearchedRim();
if (this.currentMember) {
this.searchService.changeSearchTerm(this.currentMember);
}
var waitTime = AppConstants.SEARCH_TEXT_WAITTIME;
const searchSource = document.getElementById("search-box");
const keydownStream = fromEvent(this.elementRef.nativeElement, 'keyup');
const inputStream = fromEvent(searchSource, "input");
const allStreams = merge(keydownStream, inputStream);
allStreams
.pipe(
map((event: KeyboardEvent | MouseEvent) => (<HTMLInputElement>event.target).value.trim()),
filter((searchTerm: string) => {
waitTime = Number(searchTerm) ? AppConstants.SEARCH_NUMERIC_WAITTIME : AppConstants.SEARCH_TEXT_WAITTIME;
return searchTerm.length >= 2;
}),
debounce(() => timer(waitTime)),
distinctUntilChanged()
)
.subscribe((searchTerm: string) => {
this.showProgressbar = true;
this.listSearchResults(searchTerm);
});
}
还有回车键事件:
setFocus(): void {
const searchBox: HTMLElement = document.getElementById("search-box");
const searchTerm = (<HTMLInputElement>searchBox).value;
if (searchTerm && searchTerm.length > 0) {
this.listSearchResults(searchTerm);
}
searchBox.focus();
}
在我提到的解决方案中,所有合并在一起的事件都会触发该功能,但不一定会取消正在等待的其他事件(去抖动)。
感谢您的时间
【问题讨论】:
-
所以 Enter Key Press 应该是立即搜索,而“typeahead”应该被去抖动?
-
正确,但要求如果用户按 Enter 键,则预输入不应触发该功能。如果 debounce 已经在运行,那么让 debounce 触发另一个搜索是没有意义的。