cyclejs とリアクティブ プログラミングを学習しようとしていますが、イベントを値で管理する方法がわかりません。
たとえば、次のような数学演算を行う 4 つの関数を作成する必要があります。
- 添加
- 引き算
- 分割
- 乗算
これが私が持っているコードです:
function main ({DOM}) {
const secondNumber$ = DOM
.select('.second-number')
.events('change')
.map(ev => ev.target.value)
.startWith(0)
const firstNumber$ = DOM
.select('.first-number')
.events('change')
.map(ev => ev.target.value)
.startWith(0)
const addClick$ = DOM
.select('.add')
.events('click')
.merge(firstNumber$)
.merge(secondNumber$)
.filter(value => console.log(value))
.scan((nb1, nb2) => nb1 + nb2)
return {
DOM: addClick$.map(result =>
div([
input('.first-number',{type:'text'}),
input('.second-number',{type:'text'}),
button('.add', 'Add'),
h2('Result is : ' + result)
])
)
};
}
それはまったく機能せず、自分がどこで間違っているのか頭の中で理解できません。
簡単な説明を探しています。これを機能させるにはどうすればよいですか? secondNumber$ と firstNumber$ のストリームのマージが正しくないように感じ、その理由がわかりません..
何か案が ?
編集:使用していた演算子を使用するべきではなく、withLatestFrom を使用する必要があることがわかりました。
実際のところ、私は xstream を使用しているため、マップ / フラット化する必要があります。
import {
div,
h1,
input,
button
} from '@cycle/dom';
/**
* Counter
* @param {Object} sources Contains the inputs
* @return {Object} The output sinks
*/
function counter(sources) {
const input1$ = sources.DOM
.select('.input1')
.events('input')
.map(ev => ev.target.value)
.startWith(0);
const input2$ = sources.DOM
.select('.input2')
.events('input')
.map(ev => ev.target.value)
.startWith(0);
const add$ = sources.DOM
.select('.add')
.events('click');
const resultAddition$ = add$
.map(ev => input1$
.map(value => input2$
.map(value2 => Number(value) + Number(value2)))
.flatten())
.flatten()
.startWith(0);
return {
DOM: resultAddition$.map(item => {
console.log(item); // triggered each time an input is modified
return div([
h1(`Super new value : ${item}`),
input('.input1', {
attrs: {
type: 'text'
}
}),
input('.input2', {
attrs: {
type: 'text'
}
}),
button('.add', 'Ajouter')
]);
})
};
}
export default counter;
今から、コードが何をすべきかを念頭に置いて、操作をクリックするたびにマッピングし、2 つの input$ をフラットにして、ボタンをクリックしたときにのみ結果を取得します。
実際のところ、結果の値はクリックではなく入力で変化します。さらに重要なことは、追加ボタンを最初にクリックした後にのみ、入力時に変更されることです。
今回は何が間違っていますか?
返信ありがとうございます