服务器发送一些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({...})时,新对话框会替换旧对话框,但我错了。我在创建新对话框之前通过销毁旧对话框解决了这个问题。
更好的解决方案:见下面的答案。
答案 0 :(得分:1)
创建对话框时调用“create”事件。 第二次打开对话框时,不会触发create事件,因为该元素上已存在对话框对象。 如果要在同一对话框小部件上使用不同的值,请使用“打开”事件。 这是一个样本