19

dealViewItemFOR ループの範囲に入るにはどうすればよいですか? 現在、dealViewItem はその範囲外にあり、すべてのイベント リスナーは最後の dealViewItem に追加されます。

  for deal in dealArray
        dealViewItem = dealViewFactory.DealDetail(deal)
        dealViewItem.addEventListener 'click', ->
          dealCart.push(deal.dealId)
          dealViewItem.setAddedToCart()
          btnTakeDeals.setEnabled = true
        dealHolder.add(dealViewItem)
4

1 に答える 1

36

これがdoキーワードの目的です。関数がすぐに実行され、引数の 1 つと同じ名前のローカル変数が渡され、適切なクロージャー スコープが保証されます。

for deal in dealArray
  do (deal) ->
    dealViewItem = dealViewFactory.DealDetail(deal)
    dealViewItem.addEventListener 'click', ->
      dealCart.push(deal.dealId)
      dealViewItem.setAddedToCart()
      btnTakeDeals.setEnabled = true
    dealHolder.add(dealViewItem)

コンパイル済みバージョンはこちら


do自己実行関数のループ外でも使用できます。

#coffeescript
do ->
  foo = 'bar'

// javascript
(function() {
  var foo;
  return foo = bar;
})();
于 2012-07-24T23:06:23.077 に答える