在我的模板中,我有一个字段和两个按钮:
<div class="btn-plus" (click)="add(1)"> - </div>
<div class="txt"> {{ myValue }} </div>
<div class="btn-minus" (click)="add(-1)"> + </div>
在我的component .ts文件中,我有:
add(num) {
this.myValue +=num;
this.update(); // async function which will send PUT request
}
this.update()
函数将myValue
放在一个大JSON对象的适当字段中,并将其发送到服务器。
问题:当用户在短时间内点击10次加/减按钮时,则会发送10次请求。但我想只发送一次请求-最后一次点击后0.5秒。如何操作?
7条答案
按热度按时间gxwragnw1#
使用
takeUntil
运算符:Stackblitz(打开控制台检查日志)
zbdgwd5y2#
这是我在互联网上找到的部分答案,但我愿意接受更好的解决方案(或改进到以下解决方案(指令)):
在互联网上,我发现
appDebounceClick
指令,它可以帮助我在以下方面:我从.ts文件中的
add
中删除update
:并按以下方式更改模板:
奖励
指令
appDebounceClick
由Cory Rylan编写(我在这里放置代码,以防链接将来停止工作):bvhaajcl3#
我最终使用了上面发布的
DebounceClickDirective
的简化版本。由于debounceTime
运算符不支持前导/尾随选项,我决定使用lodash
。这消除了从单击到操作的延迟,在我的情况下,这是打开一个对话框,非常烦人。然后我就像这样用
<button (debounceClick)="openDialog()">
mwyxok5s4#
一个辅助功能--
则示例使用可以是:
也可以反向使用,在单击时调用'myClick',并让
debounced
回调执行所需的操作。经销商的选择。就我个人而言,这也适用于
(keyup)
事件。不确定取消订阅是否真的有必要-实现比研究内存泄漏更快:)
o7jaxewo5#
如果不想使用
rxjs observable
示例,可以使用setTimeout
实现。这将是ngOnDestroy
上内存泄漏清理的理想实现:编辑:根据@lord-midi在评论中的建议,将timeoutRef TS def更新为更安全的版本。
aij0ehis6#
在点击事件第一次,所以你不需要等待最后一次点击。或如何忽略后续事件?
Solution by Ondrej Polesny on freecodecamp Website也感谢Cory Rylan对Debouncer的精彩解释
cfh9epnr7#
一个更容易理解的选择是使用一个自定义的主题,在点击时发出,并简单地使用rxjs原生
debounceTime
。Live Example(打开控制台日志):Stackblitz