与bacon.js混在一起。我想在一组文本输入中保持运行的总值。 github网站上的示例使用.scan
和一个加法器函数,该函数适用于该示例,因为它在流中使用-1和+1。但我希望在编辑它们时将值从流中删除,因此.scan
解决方案对我来说不起作用,或者我做得不对。
标记:
<ul style="repeat-direction: vertical; list-style-type: none;">
<li><input data-group="0"></li>
<li><input data-group="0"></li>
<li><input data-group="0"></li>
</ul>
<ul style="repeat-direction: vertical; list-style-type: none;">
<li><input data-group="1"></li>
<li><input data-group="1"></li>
<li><input data-group="1"></li>
</ul>
所以我的解决方案是在有限制的keyup事件时运行输入,然后在更改时更新span。
groupZeroEvents = events.filter (val) ->
Math.floor(val[0]) == 0 # the stream contains the group the input belongs to
groupZeroEvents.onValue (val) ->
sum = 0
$("input[data-group='0']").each (i,el) ->
sum += Math.floor($(el).val())
$('span#sum-g0').html(sum)
它工作正常,但似乎很蹩脚 - 感觉我错过了正确使用Bacon.js
的方法。
答案 0 :(得分:3)
总和取决于多个输入的当前值。如果您将这些输入建模为属性,那么您将获得更好的解决方案:
function sum(xs) { return _.reduce(xs, (function(x,y) {return x + y}), 0); }
// array of Properties representing the value of each group-zero-element
var groupZeroValues = $("input[data-group=0]").map(function(index, elem) {
return $(elem).asEventStream("keyup")
.map(function(e) { return parseInt($(e.target).val()); })
.toProperty(0)
}).toArray();
// sum Property
var groupZeroSum = Bacon.combineAsArray(groupZeroValues).map(sum)
// assign Property value to the "text" method of the sum element
groupZeroSum.assign($("#sum-g0"), "text")
我没有时间真正尝试这个,但这个想法一定会奏效。