【发布时间】:2017-02-25 00:05:43
【问题描述】:
我正在尝试在列表中任何项目的第一次和第二次单击之间捕获项目列表上的悬停事件。
例如
- 用户点击列表中的项目
- 悬停流项目发出事件
- 用户在列表中执行第二次点击和悬停事件停止
我已经设置了一个可观察的流如下:
let items = document.getElementsByClassName("item");
let itemClicks = Rx.Observable.fromEvent(items, "click");
let itemHover = Rx.Observable.fromEvent(items, "mouseenter");
let clicksWithFlag = itemClicks.scan((acc, val) => ({ val: val.target.innerHTML, firstClick: !acc.firstClick}), {});
//create stream of 1st clicks
let firstClicks = clicksWithFlag.filter(x => x.firstClick).pluck('val');
//create stream of second clicks
let secondClicks = clicksWithFlag.filter(x => !x.firstClick).pluck('val');
let hoverBetweenFirstAndSecondClick = firstClicks.flatMap(x => itemHover.takeUntil(secondClicks));
我遇到的问题是itemHover.takeUntil(secondClicks) 没有结束 itemHover 流。我认为它与来自同一个可观察对象的 firstClicks 和 secondClicks 有关,但无法弄清楚。
如果我将 takeUntil(secondClicks) 交换为任何其他流(例如停止按钮),它会起作用。
请参阅此 JSBin 示例:https://jsbin.com/dotapis/edit?js,console,output
希望有人可以提供帮助。我正在尝试使用 RxJS 构建一个范围选择器,但我开始认为将流分成第一次和第二次点击可能不是最好的路线。
更新
刚刚用 BaconJS 试过这个,我可以用几乎完全相同的代码让它工作。 https://jsbin.com/fobumu/edit?js,console,output
我确信问题在于流的非惯用用法,但不确定原因。
【问题讨论】:
标签: javascript rxjs