2

摆弄一个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 事件时遍历输入,然后在它更改时更新跨度。

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正确使用的方法。

4

1 回答 1

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")

我没有时间实际尝试这个,但这个想法肯定会奏效。

于 2013-02-07T18:14:56.230 回答