【问题标题】:How to keep the parent's context in CoffeeScript during an AJAX request如何在 AJAX 请求期间在 CoffeeScript 中保留父级的上下文
【发布时间】:2014-02-04 00:18:09
【问题描述】:

我想通过 CoffeeScript 中的一个对象,并且对于该对象中的每个项目,我都想进行 AJAX 调用(使用 jQuery)。在 AJAX 调用的回调机制中,我想打印导致请求的项目的数据,但在我的回调中,我丢失了对初始上下文的引用。上下文总是相同的:

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 但是怎么用呢?

【问题讨论】:

    标签: javascript jquery ajax coffeescript scope


    【解决方案1】:

    你也可以将它包装在一个立即函数中,并在这个上下文中存储一个变量:

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

    请注意,使用此方法,您必须先声明回调,然后再调用它。

    但可能最“咖啡脚本方式”是使用 do 关键字,它立即调用传递的函数,转发任何参数:

    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
    

    【讨论】:

    • 这很有帮助。谢谢!!我喜欢使用 $.each
    【解决方案2】:

    好的。我用$.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) 
    

    【讨论】:

      猜你喜欢
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      相关资源
      最近更新 更多