已经找到问题 - 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]
);
});
答案 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