Ajax on Change不会覆盖.done上的数据

Ajax on Change doesn't overwrite data on .done

本文关键字:done 数据 覆盖 on Change Ajax      更新时间:2023-09-26

我一直在构建一个小的"插件"来重用rails应用程序中的一些代码,以根据父选择元素和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)

因此,这在第一个更改事件中起作用。它用预期的数据构建选择。第二次触发更改事件时,成功回调接收到第一次触发更改事件时相同的数据,从而使用旧数据构建select。

我怎么能解决这个问题,使数据变量在。done回调改变每个ajax请求?我很确定我把这些变量的作用域弄乱了。

解决方案:是url,笨蛋。Ajax方法对每个更改事件都重复相同的请求。在阅读了一些关于闭包的内容并怀疑了一个相关的问题之后,更明显的是,使用change event发送的url在内部定义时保持了相同的值。我只需要处理发送UrlGetter而不是urldisplayDependent,现在它像预期的那样工作。