2014-10-16 2 views
2

У меня есть 3 потока событий для mouseDown, mouseUp и mouseMove. Это работает до сих пор, когда пользователь не попал в alt Key, он делает что-то на мыши, двигаясь до мышки.Как реагировать на поток takeUntil в baconJS

this.mouseDown 
    .filter((e) =>!e.altKey) 
    .flatMap(() => this.mouseMove.takeUntil(this.mouseUp)) 
    .onValue((e) => this.setState({previewEndPoint: this.getNearestPoint(e)})); 

Мой вопрос: как я могу реагировать на событие мыши в этом случае?

ответ

2

Установка переменной в doAction и использовать его в другом месте действительно плохой знак и ненужным. Я реорганизовал ваш код для использования комбинированных потоков.

var moveStart = this.mousedown 
    .filter((e) =>!e.altKey && !e.metaKey)  

var move = moveStart.flatMap((e) => 
    this.mousemove 
     .takeUntil(this.mouseup) 
     .startWith(this.getNearestPoint(e)) 
); 

var startPoint = moveStart.map((e) => this.getNearestPoint(e)) 

var endPoint = move.map((e) => this.getNearestPoint(e)) 

var preview = startPoint.combine(endPoint, (start, end) => { 
    preview: true, 
    startPoint: start, 
    previewEndPoint: end 
}) 

preview.onValue((state) => this.setState(state)); 

move.onEnd(this.endLine.bind(this)); 
+0

Спасибо, кстати есть небольшая ошибка, я думаю, что это должно быть: 'StartPoint: start' –

+0

И по некоторым причинам функция OnEnd не называется больше –

+0

... и в последней строке, вы, вероятно, имел в виду' .bind (this) ' – Bergi

1

Мне нужно было создать поток, который был запущен мышью, и преобразуется в движение мыши , используя flatMap, который затем остановится при помощи мыши. Тогда я просто слушать onValue и onEnd

var move = this.mousedown 
    .filter((e) =>!e.altKey && !e.metaKey) 
    .doAction((e) => startPoint = this.getNearestPoint(e)) 
    .flatMap(() => this.mousemove.takeUntil(this.mouseup)); 

move.onValue((e) => this.setState({ 
    preview: true, 
    startPoint: startPoint, 
    previewEndPoint: this.getNearestPoint(e) 
})); 

move.onEnd(this.endLine.bind);