2014-01-15 23 views
3

我想通過CoffeeScript中的對象以及該對象中的每個項目來使用AJAX調用(使用jQuery)。在AJAX調用的回調機制中,我想打印導致該請求的項目的數據,但在回調中,我失去了對初始上下文的引用。上下文始終相同:如何在AJAX請求期間在CoffeeScript中保留父項的上下文

data = 
    one: 
    id: 1 
    two: 
    id: 2 
    three: 
    id: 3 
    four: 
    id: 4 
    five: 
    id: 5 

callback = (data, textStatus, jqXHR) ->  
    console.log value.id # It's always "5" :-(

for key, value of data 
    $.get ".", callback 

如何保持上下文?我已經用fat arrow爲我的回調試過了,但這沒有幫助。 I read有什麼叫做$.proxy但是如何使用它?

回答

4

你也可以將它包裝在一個立即函數和變量存儲在此背景下:

for key, value of data 
    (-> 
    val = value 
    callback = (data, textStatus, jqXHR) ->  
     console.log val.id 
    $.get ".", callback 
)() 

注意,用這種方法,你必須調用前首先聲明回調。

但propably最「CoffeeScript的方式」,是與關鍵字,它立即調用傳遞功能,轉發任何參數:

for key, value of data 
    do (value)-> 
    callback = (data, textStatus, jqXHR) ->  
     console.log value.id 
    $.get ".", callback 

另一種方式實現這一目標,是利用jQuery的each迭代功能:

$.each data, (index, value) -> 
    callback = (data, textStatus, jqXHR) ->  
    console.log value.id 
    $.get ".", callback 
+0

這非常有幫助。謝謝!!我喜歡使用$ .each –

0

好的。我用$.ajax替換$.get,然後使用context屬性解決了問題。但是,還有一種CoffeeScript方式可以做到嗎?因爲我的解決方案取決於jQuery。

data = 
    one: 
    id: 1 
    two: 
    id: 2 
    three: 
    id: 3 
    four: 
    id: 4 
    five: 
    id: 5 

callback = (data, textStatus, jqXHR) ->  
    console.log @id 

for key, value of data 
    $.ajax 
    url: "." 
    type: "GET" 
    context: @value 
    .always(callback) 
相關問題