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

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


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

最佳答案

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


每当组合源之一发出一个值时(只要每个源可观察序列已发出至少一个元素),combinateLatest将发出一个值。
仅当合并源发出值时,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$辐射。那是预期的行为吗?

07-24 09:43