我一直在构建一个小的“插件”来重用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请求?我很确定我搞砸了这些变量的范围。
答案 0 :(得分:0)
解决方案:这是网址,愚蠢。 Ajax方法对每个更改事件重复相同的请求。在关闭了a bit关闭并怀疑相关问题之后,更明显地看到随着更改事件发送的url在内部定义时保持相同的值。我只需处理UrlGetter
而不是url
到displayDependent
的处理,现在它按预期工作。