服务器发送一些 JSON。它包含结构化数据列表。我将此数据显示为文本框列表,每个文本框都有自己的onClick
事件。点击时,文本框的值设置为结构化数据中的任何值(这是一个唯一的 ID,这意味着每个文本框都应在点击时显示 ID)。
当我第一次单击任何文本框时,它的值设置正确 - 使用来自服务器数据的 ID。但是当我单击其他文本框时,它们会显示第一次单击文本框的 ID!
我已经尝试了闭包 var 和$.proxy()
,但它们似乎不起作用。我已经检查了的内容,并且它们在函数myAttribute
的每次迭代中都会发生变化。$.each()
但是,该click()
事件似乎在“运行时”进行评估并且不会更新。
问题是:
- 如何解决我的问题,以便
myProcessedAttribute
包含正确的数据而不是第一次点击时的数据? - 我觉得我拥有四个嵌套函数的方法可能不是最佳实践。或者是吗?
代码:
$.ajax({
[...]
success: function (data) {
[...]
$.each(data.listOfData, function () {
[...]
var myAttribute = this.myCoolAttribute; // <-- closure
jQuery('<p/>')
[...]
.click(function () {
var myProcessedAttribute = process(myAttribute);
[jquery ui dialog...]
create: function () {
// it always contains the same data
// the data on first click, after that, it never changes.
$("#myDialog").html(myProcessedAttribute);
}
});
});
}
});
编辑:我刚刚alert(myProcessedAttribute)
加入了click()
活动create
。在前一种情况下,警报显示正确的数据。在后一种情况下,警报仅在第一次点击时显示,但在随后的点击中再也没有出现过!
我的解决方案:我认为在调用 .dialog({...}) 时,新对话框会替换旧对话框,但我错了。我通过在创建新对话框之前销毁旧对话框解决了这个问题。
更好的解决方案:请参阅下面的答案。