2016-04-27 4 views
1

В Javascript и с использованием Kefir я хотел бы захватить все вводы клавиш до тех пор, пока не ударит ENTER. До сих пор мне удалось это сделать с помощью bufferWhile какЗахват всех вводов клавиш до тех пор, пока не будет нажата клавиша ENTER в режиме реактивного программирования.

var inputValues = Kefir 
    .fromEvents(document.querySelector('body'), 'keydown') 
    .bufferWhile(event => event.keyCode!=13); 

var result = inputValues.toProperty(() => ""); 
result 
.onValue(x => elm.innerHTML = x.slice(0,-1).map(y => String.fromCharCode(y.keyCode)).join('')) 
.onError(() => elm.innerHTML = "?"); 

, но изначально я хотел использовать обычный scan как в

var inputValues = Kefir 
    .fromEvents(document.querySelector('body'), 'keydown') 
    .scan((acc, y) => acc.concat(y), ""); 

, но тогда как я:

  1. Вывод аккумулятора, когда удаляется ENTER?
  2. Перезапустите аккумулятор, чтобы начать новую последовательность нажатия клавиш?

По существу, как вы составляете bufferWhile с использованием scan и одного потока? Ответ не обязательно должен быть конкретно о Кефире, хотя любой псевдо-код FRP будет делать.

+0

Он работает для вас с 'bufferWhile', но вы хотите сделать то же самое с' scan'? – iofjuupasli

+0

@iofjuupasli 'scan' или что-то еще. Я хотел бы достичь того же и, возможно, добавить тайм-аут, чтобы захватить кластерные нажатия клавиш. –

ответ

1

Я не уверен, что это то, что вы хотите. В целом идея состоит в том, чтобы отделить поток подтверждения и выполнения. И соединить его каким-то образом:

const input$ = ...; 
const key$ = input$.filter(isNotEnter).map(toChar); 
const enter$ = input$.filter(isEnter); 

const confirm$ = Kefir.merge([ 
    enter$, 
    key$.debounce(1000) 
]); 

key$.bufferBy(confirm$); 
+0

Большое спасибо! Просто взял на себя смелость немного адаптировать первый поток. То, что я искал, было 'merge' и' key $ .bufferBy (confirm $) 'parts. Почему вы «debounce (1000)»? –

+0

'debounce' - это просто, например, что вы можете подтвердить свой ввод не только с помощью ввода, но также и с любым другим событием, например, через 1 с после последнего ввода – iofjuupasli

+0

Извините, что вы прослушали вас снова, но как бы вы указали, что только удары, произошедшие за 500 мс следует учитывать поток 'enter $' (если не считать 'ключ $ .debounce (1000)')? –

 Смежные вопросы

  • Нет связанных вопросов^_^