2015-05-09 2 views
1

Так у меня есть некоторые потоки событий:Как отменить событие click, если он был связан с событием перетаскивания с использованием 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()); 

я хотел бы, чтобы игнорировать клики, которые получают запускаемые сразу после перетаскивания заканчивается. Я чувствую, что существует довольно простой способ сделать это, но я все еще борюсь с некоторыми из основных концепций.

ответ

3

Решение заключается в создании свойства с использованием 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/

+0

Спасибо так много! Это так элегантно и просто! Понятно, что мне еще предстоит немного поработать, прежде чем я полностью оберну свой взгляд на этот способ мышления. –

 Смежные вопросы

  • Нет связанных вопросов^_^