2017-05-04 92 views
0

我正在做类似的事情,尽管不完全像拖放。我想单击>跟踪移动以进行预览>再次单击时停止跟踪>从最后一次点击获取元数据。但是,用户可以点击多件事物来停止跟踪,我想知道它是什么,因为副作用取决于所点击的第二项而不同。如何从停止可观察到的价值获取价值

基本上,其

clickSomething$ = merge(anythingTheyCanClick); 
click$.switchMap(click => moveData.takeUntil(clickSomething$)) //need to get value from clickSomething$ 

这是从在takeUntill观察到的停止获取值的特定请求,但如果这是不可能的或不切实际的,包括性的缓冲区或窗口技术(例如缓冲器/窗点击,但保持点击)也可以解决问题。

回答

0

您可以合并所有可观察到的阻塞物(obsStop $),映射第一个停止事件以将其与mousemove区分开来,仅采用一个此类事件并用伪'close - takeUntil'事件进行连接。 takeWhile将采取所有的鼠标移动和关闭事件,直到虚拟'close - takeUntil'事件来临。

let start = document.getElementById('start'); 
    let stop1 = document.getElementById('stop1'); 
    let stop2 = document.getElementById('stop2'); 
    let stop3 = document.getElementById('stop3'); 

    let start$ = Rx.Observable.fromEvent(start, 'click'); 
    let stop1$ = Rx.Observable.fromEvent(stop1, 'click'); 
    let stop2$ = Rx.Observable.fromEvent(stop2, 'click'); 
    let stop3$ = Rx.Observable.fromEvent(stop3, 'click'); 

    let obsStop$ = Rx.Observable.merge(stop1$, stop2$, stop3$); 

    start$.switchMap(x => { 
    return Rx.Observable.fromEvent(document, 'mousemove') 
     .merge(obsStop$ 
     .map(event => { 
      return {stopClick: true, event: event}; 
     }) 
     .take(1) 
     .concat(Rx.Observable.of('takeUntil'))) 
     .takeWhile(x => x !== 'takeUntil') 

    }).subscribe(x => console.log(x));