更改上的Ajax不会覆盖.done上的数据

时间:2015-10-17 00:29:32

标签: javascript jquery ruby-on-rails ajax coffeescript

我一直在构建一个小的“插件”来重用rails应用程序中的一些代码来构建和拆除select元素,具体取决于父select元素和ajax响应的值。所有的Web服务和功能都运行正常,直到我开始将此代码分离为可重用的代码。这是coffescript中的当前代码:

$.fn.cascade = (urlGetter, paramGetter, callbacks)->
  callbacks[type] = callbacks[type] || $.noop for type in ["success", "notFound"]
  url = urlGetter.call(this)
  eventParams = {url: url, paramGetter: paramGetter, callbacks: callbacks}
  this.on 'change', eventParams, displayDependent

getRequest = (url, data) ->
  $.ajax (
    method: 'GET'
    url: url
    dataType: 'json'
    data: data
  )

displayDependent = (event) ->
  url = event.data.url
  params = event.data.paramGetter()
  callbacks = event.data.callbacks
  getRequest(url, params)
    .done (data, textStatus, jqXHR) ->
      statusCode = jqXHR.status
      switch statusCode
        when 200
          callbacks["success"].call(this, data)
        when 204
          callbacks["notFound"].call(this, data) 
        else console.log 'Unexpected status code: ' + statusCode
    .fail (jqXHR, textStatus, errorThrown) ->
      console.log errorThrown

这会以这种方式在选择器上调用:

$("someElement").cascade(urlGetter, paramGetter, callbacks)

所以,这是第一次改变事件。它使用预期数据构建选择。第二次更改事件触发时,成功Callback在第一个change-event被触发时接收相同的Data,从而使用旧数据构建select。

如何修复此问题,以便.done回调中的数据变量会更改每个ajax请求?我很确定我搞砸了这些变量的范围。

1 个答案:

答案 0 :(得分:0)

解决方案:这是网址,愚蠢。 Ajax方法对每个更改事件重复相同的请求。在关闭了a bit关闭并怀疑相关问题之后,更明显地看到随着更改事件发送的url在内部定义时保持相同的值。我只需处理UrlGetter而不是urldisplayDependent的处理,现在它按预期工作。