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>

したがって、私が持っている解決策は、スロットルされたキーアップイベントがあるときはいつでも入力を実行し、それが変更されたときにスパンを更新することです。

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 に答える