使用combineAsArray改变BaconJS中的流集

时间:2016-03-27 21:54:58

标签: bacon.js

已经找到问题 - how should I keep a running total of several values with bacon.js?

我已经找到了上述问题,该问题涉及一组静态属性。但是,我对变体感兴趣,其中属性集是动态的。

我的具体情况是,我有一组具有可编辑成本的东西,形成了一个可观察的财产。从这些中,我将属性与combineWith组合在一起,以获得所有事件的总成本。 (最后的代码)

现在,我已经使用jQuery正确地为一组静态事件连接了属性以获得正确的值,但想法是用户可以任意添加(或删除)事件并计算总数将相应更新。

我有一个模糊的暗示,这个工作的工具是combineAsArray,并且在我的所有流的公共父级上有一些巧妙的事件监听,或者可能某种Bacon.Bus(动态插入)流入它?),但我现在 真的旋转我的车轮......

(伪)代码

<table>
  <tr>
    <td><input id="thing1" value="40"></input></td>
  </tr>
  <tr>
    <td><input id="thing2" value="40"></input></td>
  </tr>
</table>


$(function() {
  stream1 = $("#input1").asEventStream("change blur keyup").toProperty();
  stream2 = $("#input2").asEventStream("change blur keyup").toProperty();
  totalMonthlyCost = Bacon.combineWith(
    sumAll,
    [stream1, stream2]
  );
});

1 个答案:

答案 0 :(得分:3)

组合一组不断变化的属性的关键是flatMapLatest。您可以先将当前的有效输入组表示为

inputsP = ...

从那里,你可以映射到当前的属性集合,如

propertiesP = inputP.map(i => i.asEventStream("change").map(() => i.value()).toProperty())

这是一个属性数组为Arrays的属性,或者在Haskellish中,您可以将其称为Property (Array Property)。您可以将其展平为Property Array或包含值数组的属性,只需

即可
valuesP = propertiesP.flatMapLatest(Bacon.combineAsArray).toProperty()

最后,将您的sumAll功能应用于

valuesP.map(sumAll)

...假设sumAll使用一个值数组作为其唯一参数。

当然,有人可能认为有更简单的方法可以达到同样的效果。就像在整个容器元素上侦听所有有趣的输入事件并使用JQuery从容器中获取输入值一样,将这些内容提供给sumAll。像

$container.asEventStream("change blur keyup", "input")
  .map(() => $container.find("input").toArray().map(() => $(this).value()))
  .map(sumAll)

或者那些东西。另见:http://baconjs.blogspot.fi/2013/02/chicken-egg-and-baconjs.html