2

我目前正在使用 Cycle.js,并且我正在尝试在提交表单时获取文本输入流。例如:

const textChange$ = DOMSource.select('input').events('change');
const textValueSubmit$ = DOMSource.select('form').events('submit')
    .do(ev => ev.preventDefault());

我认为此时我需要合并流,但我只关心最新的文本值(当用户提交表单时)。处理这种情况的适当方法是什么?

4

2 回答 2

2

您也可以使用sample()来避免创建额外的功能,我相信这是您正在寻找的功能

const textChange$ = DOMSource.select('input').events('change')
  .pluck('target', 'value')
const submit$ = DOMSource.select('form').event('submit')
  .do(ev => ev.preventDefault)
const textValueSubmit$ = textChange$.sample(submit$)
于 2016-03-28T22:59:16.257 回答
2

除了当前的答案,您还可以使用withLatestFrom. 请注意,combineLatest语义withLatestFrom在细微之处有所不同:

  • 每当组合源之一发出一个值时, combineLatest 都会发出一个值(只要每个源可观察序列都发出至少一个元素
  • withLatestFrom 仅在组合源发出值时才会发出值

所以你可以做例如:

const textChange$ = DOMSource.select('input').events('change')
  .pluck('target', 'value')
const submit$ = DOMSource.select('form').event('submit')
  .do(ev => ev.preventDefault)
const textValueSubmit$ = submit$.withLatestFrom(textChange$, function (submit, textChange){...});

即使这不仅仅涵盖您的特定用例(在这里您不关心提交事件传递的值,因此建议sample也可以正常工作),将这两个运算符牢记在心仍然很好类似的未来用例。

最后一件事,combineLatest在这种情况下真的对你有用吗?似乎textValueSubmit$每次textChange$火灾都会有排放。这是预期的行为吗?

于 2016-03-28T23:48:50.810 回答