RxJS有几个输入流。正确的方法来处理它们?

时间:2016-04-02 16:23:55

标签: rxjs

我的应用程序有五个输入,我想在最终数字中计算每个输入的总和。

到目前为止,我做到了这一点:

const input1 = document.querySelector("#text1");
const input2 = document.querySelector("#text2");
const input3 = document.querySelector("#text3");
const input4 = document.querySelector("#text4");
const input5 = document.querySelector("#text5");

function setObservable(selector) {
    return Rx.Observable
        .fromEvent(selector, "input")
        .map(event => parseInt(event.target.value))
        .startWith(0)
}

const input$ = setObservable(input1)
const input2$ = setObservable(input2)
const input3$ = setObservable(input3)
const input4$ = setObservable(input4)
const input5$ = setObservable(input5)


const source = Rx.Observable.combineLatest(input$, input2$, input3$, input4$, input5$)

source.subscribe(value => {
    const totalHTML = document.querySelector(".total");
    const total = value.reduce((acc, curr) => acc + curr, 0);

    totalHTML.textContent = total;
});

哪种工作正常...但是有没有更优雅的方法来获取每个输入的值而不指定所有输入?

1 个答案:

答案 0 :(得分:0)

当然!让我们将所有选择器存储在一个数组中:

const selectors = ['#text1', '#text2', '#text3', '#text4', '#text5'];

让我们映射这些以获得实际元素:

const elements = selectors.map(s => document.querySelector(s));

现在让我们映射这些元素并获得一组Observables:

const clickStreams = elements.map(setObservable);

最后我们可以结合最新的(就像你之前做的那样):

const click$ = Rx.Observable.combineLatest(clickStreams);