javascript - 使用 FRP 和 Bacon.js 优雅地处理双击和单击

标签 javascript functional-programming coffeescript frp bacon.js

我试图找到在 Bacon.js 中区分单击和双击的最优雅的方法,但我觉得我没有完全理解它是如何工作的。以下适用于检测双击,但我对如何优雅地为单击事件指定不同的行为(即不同的回调函数)感到有点困惑。

  clicked = Bacon.fromEventTarget(document, "click")
  clicked.bufferWithTimeOrCount(300, 2)
          .filter((x) -> x.length is 2)
          .onValue (x) ->
            console.log "double clicked: ", x

最佳答案

您可能最好单独使用“dblclick” - 您将避免需要为单击与双击指定自己的时间间隔。另一方面,直接使用“click”/“dblclick”会在双击时触发这两个事件。

如果您更喜欢指定自己的逻辑,那么它可能就像对长度做一个不同的过滤器:

clicked = Bacon.fromEventTarget(document, "click")
buffered = clicked.bufferWithTimeOrCount(300, 2)
buffered.filter((x) -> x.length is 2)
        .onValue (x) ->
          console.log "double clicked: ", x            
buffered.filter((x) -> x.length is 1)
        .onValue (x) ->
          console.log "single clicked: ", x

此外,也许可以通过使用平面图来创建单个点击流来使其更加优雅:

clicks = clicked.bufferWithTime(300)
   .flatMap((x) ->
     if (x.length < 2) 
       Bacon.once("single")
     else 
       Bacon.once("double")
   )

然后您可以执行 onValue 并比较值。

通过执行 bufferWithTime(不计算),您也可以将三次点击归类为双击,但这取决于您想要的行为是什么。

关于javascript - 使用 FRP 和 Bacon.js 优雅地处理双击和单击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17938769/

相关文章:

Java 8 按顺序生成唯一的数字对

node.js - 运行使用 Node js 的 CoffeeScript

javascript - jQuery UI 选项卡 : Targeting Dynamic Tab from a Link

php - 如何使用 php 和 javascript 从 mysql 中删除行

oop - 函数式编程中的领域驱动设计?

ruby-on-rails - Backbone.js + Handlebars 每个

javascript - 在 VIM 中快速切换 CoffeeScript 和 JavaScript 文件

javascript - 同一表单上的多个日期选择器

c# - 从 C# 页面弹出警告消息

clojure - 关于 Vars Clojure 的问题