2012-07-24 11 views
18

Jak mogę ustawić dealViewItem w zasięgu pętli FOR? Obecnie dealViewItem ma zasięg poza nim, a wszystkie moje detektory zdarzeń są dodawane do ostatniego dealViewItem.Uzyskiwanie Coffeescript do utworzenia zmiennej lokalnej w pętli FOR

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

mają lektury http://dailyjs.com/2012/07/23/js101-scope/ który opisuje javascript scopingu, która dziedziczy coffeescript, można zobaczyć, co robi i dlaczego robić tam jej jak pokazano w Alexs odpowiedź –

+1

err, tylko, aby być wyraźnym, javascript nie ma zakresu bloku, tylko globalny i zakres funkcji –

+0

link dailyjs jest zepsuty. Niektóre inne linki - http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html i http://zef.me/blog/2843/javascript-the-scope-pitfall –

Odpowiedz

32

to jest właśnie to słowo kluczowe do. Natychmiast uruchomi on funkcję, a wszelkie zmienne lokalne o tej samej nazwie co jeden z argumentów zostaną przekazane do niej, zapewniając odpowiedni zakres zamknięcia.

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) 

Sprawdź compiled version here


do może być również stosowany na zewnątrz pętli do wykonywania funkcji własny.

#coffeescript 
do -> 
    foo = 'bar' 

// javascript 
(function() { 
    var foo; 
    return foo = bar; 
})(); 
+3

Zaoszczędzili mi godziny. – woodardj

+0

Ditto. Świetna robota @woodardj. –

Powiązane problemy