我目前正在使用Cycle.js,并试图在提交表单时为文本输入获取流。例如:
const textChange$ = DOMSource.select('input').events('change');
const textValueSubmit$ = DOMSource.select('form').events('submit')
.do(ev => ev.preventDefault());
我想我现在需要合并流,但我只关心最新的文本值(当用户提交表单时)。处理这种情况的适当方法是什么?
添加到当前答案中,您还可以使用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
在这种情况下真的适用于您吗?似乎每次textChange$
发射时都会有textValueSubmit$
发射。这是预定的行为吗?
您也可以使用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$)