2017-05-04 182 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));