javascript - 捕获所有按键输入,直到以响应式(Reactive)编程方式按下 ENTER

标签 javascript reactive-programming kefir.js

在 Javascript 中并使用 Kefir,我想捕获所有按键输入,直到按下 ENTER 为止。到目前为止,我已经成功地使用 bufferWhile 来做到这一点,例如

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), "");

但是我该怎么办:

  1. 按下 ENTER 时输出累加器?
  2. 重新启动累加器以开始新的击键序列?

本质上,如何使用 scan 和单个流来组合 bufferWhile ?不过,答案不必专门针对 Kefir,任何 FRP 伪代码都可以。

最佳答案

我不确定这是否是您想要的。 一般来说,想法是将确认流和实现流分开。并以某种方式组合它:

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$);

关于javascript - 捕获所有按键输入,直到以响应式(Reactive)编程方式按下 ENTER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36889804/

相关文章:

javascript - HTML 类型 ="range"值只有在滑动后才会生成

javascript - 有没有办法让 jQuery .js 文件只包含我使用的函数?

java - ReactFX EventStreams 和重播行为?

java - 有状态 Rsocket 应用程序

rxjs - 在满足条件之前忽略流中的事件?

javascript - 使用 Kefir 通过多个事件改变属性的惯用方法

javascript - 是否可以使用 JavaScript 插入呈现的 ASP.NET 控件?

javascript - jquery String选择器和domElement选择器的区别

javascript - Observables - 防止数组的 onCompleted