伙计们,我有一个使用RxJS处理鼠标事件的应用程序。我正在将这些事件组合成更复杂的可观察的手势'。一个这样的姿势是"摇动"。
我想要撰写的一系列事件是:
mousedown
mousemove left
mousemove right
mousemove left
mousemove right
mouseup
我发现的是
mousedown
mouseup
mousemove left
mousemove right
mousemove left
mousemove right
也会触发相同的结果。
我做了a fiddle demonstrating the issue on codepen。
我的问题一般是:你如何在RxJS中表达一个obeservable,比如mouseup,应该取消并重新启动一个observable的组合?
作为问题的另一个例子(来自同一个小提琴),以下事件
mousedown
mouseup
mousedown
mouseup
mousedown
mousemove left
mousemove right
mousemove left
mousemove right
导致3次震动事件。我希望它能产生一个。
答案 0 :(得分:4)
使用takeUntil
var down = $div.onAsObservable('mousedown');
var up = $div.onAsObservable('mouseup');
var move = $div.onAsObservable('mousemove');
var shake = down.flatMapLatest(function (downev) {
var current = downev;
return move
.map(function (ev) {
var delta = ev.pageX - current.pageX;
current = ev;
return delta < 0 ? 'left' : 'right';
})
.takeUntil(up)
.toArray();
})
.subscribe(function (moves) {
// see if moves is an array of left,right,...