Скоупинг обратного вызова JSONP и CoffeeScript - PullRequest
1 голос
/ 18 января 2012

Вот мой 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 «упаковка».

Я предполагаю, что обратный вызов не может быть доступен из-за переноса.Есть ли умный способ обойти это?

Ответы [ 2 ]

3 голосов
/ 18 января 2012

В стандартной области действия coffeescript ключевое слово this относится к глобальному объекту окна. Так что если вы напишите свою функцию как

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

Тогда это должно быть то же самое, что положить его за пределы затвора. Это связано с тем, что замыкание вызывается с параметром this:

(function(this) {
   // your code
})(this)
1 голос
/ 18 января 2012

Я думаю, причина, по которой он не работает, заключается в том, что контекст, в котором он будет искать вашу функцию, будет верхним, то есть окном.

Что вам нужно сделать, это переименовать функцию window.subscribe_callback = (data)-> и т. Д.

...