2016-04-27 8 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 = "?"); 

を使用して、これを行うために管理してきましたが、最初私は

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

のように定期的にscanを使用していたが、その後どのようにI:

  1. ENTERがヒットしたときにアキュムレータを出力しますか?
  2. アキュムレータを再起動して新しいキーストロークシーケンスを開始しますか?

bufferWhileを基本的にどのように構成しますか?scanと1つのストリームを使用していますか?答えはケフィアに関して特に必要はありませんが、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 $) '部分でした。なぜあなたは 'デバウン(1000)'をしていますか? –

+0

'debounce'は入力だけでなく、最後に入力した1秒後のような他のイベントでもあなたの入力を確認できます。 – iofjuupasli

+0

もう一度ご迷惑をおかけして申し訳ありませんが、500 ms以内に発生したストローク( '$ $ .debounce(1000)'がないと仮定して) 'enter $'ストリームを考慮する必要がありますか? –

関連する問題