如果使用 Bacon.js 跟随拖动事件,我将如何取消单击事件?
How would I cancel a click event if it was following a drag event using Bacon.js?
所以我有一些事件流:
let mouseUps = $(window)
.asEventStream('mouseup');
let mouseDowns = $(window)
.asEventStream('mousedown');
let mouseMoves = $(window)
.asEventStream('mousemoves');
let drags = mouseDowns
.flatMapLatest(() => mouseMoves.takeUntil(mouseUps));
let clicks = $(window)
.asEventStream('click')
.onValue(() => doThing());
我想忽略在拖动结束后立即触发的点击。我觉得必须有一种相当简单的方法来做到这一点,但我仍在努力解决一些核心概念。
解决方法是使用stream.awaiting()
创建一个属性,可以用来过滤掉拖动后的点击。
var btn = $('#btn');
var mouseUps = btn.asEventStream('mouseup');
var mouseDowns = btn.asEventStream('mousedown');
var mouseMoves = btn.asEventStream('mousemove');
var drags = mouseDowns.flatMapLatest(function () {
return mouseMoves.takeUntil(mouseUps);
});
var clicks = btn.asEventStream('click');
var isDraggingStarted = drags.awaiting(mouseDowns);
clicks.filter(isDraggingStarted.not()).onValue(doThing);
可在此处找到示例:http://jsfiddle.net/a128jhxb/1/
所以我有一些事件流:
let mouseUps = $(window)
.asEventStream('mouseup');
let mouseDowns = $(window)
.asEventStream('mousedown');
let mouseMoves = $(window)
.asEventStream('mousemoves');
let drags = mouseDowns
.flatMapLatest(() => mouseMoves.takeUntil(mouseUps));
let clicks = $(window)
.asEventStream('click')
.onValue(() => doThing());
我想忽略在拖动结束后立即触发的点击。我觉得必须有一种相当简单的方法来做到这一点,但我仍在努力解决一些核心概念。
解决方法是使用stream.awaiting()
创建一个属性,可以用来过滤掉拖动后的点击。
var btn = $('#btn');
var mouseUps = btn.asEventStream('mouseup');
var mouseDowns = btn.asEventStream('mousedown');
var mouseMoves = btn.asEventStream('mousemove');
var drags = mouseDowns.flatMapLatest(function () {
return mouseMoves.takeUntil(mouseUps);
});
var clicks = btn.asEventStream('click');
var isDraggingStarted = drags.awaiting(mouseDowns);
clicks.filter(isDraggingStarted.not()).onValue(doThing);
可在此处找到示例:http://jsfiddle.net/a128jhxb/1/