确定JSONP回调和CoffeeScript的范围

时间:2012-01-18 02:32:53

标签: jquery jsonp coffeescript

这是我的CoffeeScript:

jQuery -> 
  $("form").submit (e) -> 
    e.preventDefault() 
    email = $("#email").val() 
    return if email.length == 0 
    $.ajax 
      url: "https://api.kickofflabs.com/v1/1905/subscribe", 
      data: "email=#{email}", 
      dataType: 'jsonp', 
      jsonp: 'jsonp',
      jsonpCallback: 'subscribe_callback', 
      timeout: 2000, 
      error: (a, b, e) -> 
        alert e
        console.log e

subscribe_callback = (data) ->
  console.log(data) 
  alert("Signed up #{data.email}")

这也是一个要点:https://gist.github.com/1630460

我能让它发挥作用的唯一方法就是将回调移到coffeescript'wrap'之外。

我的猜测是因为换行而无法访问回调。有一种聪明的方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

在标准coffeescript范围中,this关键字引用全局窗口对象。所以如果你把你的功能写成

this.subscribe_callback = (data) ->
  console.log(data) 
  alert("Signed up #{data.email}")

然后它应该与把它放在闭包之外相同。这是因为使用this作为参数调用闭包:

(function(this) {
   // your code
})(this)

答案 1 :(得分:1)

我认为它不起作用的原因是因为它将寻找你的功能的上下文将是最重要的,即窗口。

您需要做的是重命名函数window.subscribe_callback = (data)->等。