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

現在の回答に加えて、 を使用することもできますwithLatestFromcombineLatestwithLatestFromセマンティクスが微妙な点で異なることに注意してください。

  • 結合されたソースの 1 つが値を発行するたびに、combineLatest は値を発行します (ソースの監視可能なシーケンスのそれぞれが少なくとも 1 つの要素を発行している限り) 。
  • 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うまく動作します)、別の場合のためにこれら 2 つの演算子を念頭に置いておくことをお勧めします。同様の将来のユースケース。

最後combineLatestに、この場合、本当にうまくいきますか? 発火textValueSubmit$するたびに発光するようです。textChange$それは意図した動作ですか?

于 2016-03-28T23:48:50.810 に答える
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 に答える