【发布时间】:2015-11-01 07:31:41
【问题描述】:
我一直在尝试使用 RxJs 在基于画布的白板上替换鼠标事件侦听器。我的绘图效果很好,但由于某种原因,completed 函数永远不会被调用。
它非常简单,基于 RxJs 文档中的鼠标事件示例。这是代码的摘录,您可以在此处查看完整版本http://codepen.io/hanloong/pen/YyvqgM?editors=001
point = (start, prev, current) ->
start: {x: start.offsetX, y: start.offsetY}
previous: {x: prev.offsetX, y: prev.offsetY}
current: {x: current.offsetX, y: current.offsetY}
mouseup = Rx.Observable.fromEvent(document, 'mouseup')
mousemove = Rx.Observable.fromEvent(document, 'mousemove')
mousedown = Rx.Observable.fromEvent(document, 'mousedown')
mousedrag = mousedown.flatMap (start) ->
mousemove.zip mousemove.skip(1), (prev, current) ->
point(start, prev, current)
.takeUntil mouseup
liveDraw = Rx.Observer.create(
(pos) ->
console.log pos
# drawLine stage, shape, pos.previous, pos.current
, (err) ->
console.log "Error: #{err}"
, () ->
# never gets run
console.log 'Complete'
)
mousedrag.subscribe liveDraw
目标是在用户完成绘图后将完整路径发送到服务器,这在理想情况下会发生在完成的回调中。此时是否可以检索整个集合,或者我应该在事件进入时构建另一个数组?
【问题讨论】:
-
你可以在这里尝试类似的东西:stackoverflow.com/questions/22225810/…。或者,您可以尝试调试以查看发生了什么。参考:github.com/Reactive-Extensions/RxJS/blob/master/doc/…
-
您是想在
mousedragobservable 上调用takeUntil,还是在调用flatMap时在压缩后的 observable 上调用takeUntil?它在你的咖啡脚本中不是很清楚(看看输出 js 显示它当前附加到通过调用mousemove.zip创建的可观察对象)。 -
takeUntil在zip上。如果我将其移至mousedrag,则确实会调用完整的回调,但缺点是我必须在每次鼠标拖动完成后创建一个新订阅(据我所知)。 -
您是否在我提供给您的第一个链接中看到了答案,特别是使用
repeat运算符重新订阅mousedown? -
是的,谢谢,添加
repeat()是一种享受。只是考虑用什么方法来收集整个鼠标拖动路径完成。
标签: coffeescript easeljs rxjs