2

服务器发送一些 JSON。它包含结构化数据列表。我将此数据显示为文本框列表,每个文本框都有自己的onClick事件。点击时,文本框的值设置为结构化数据中的任何值(这是一个唯一的 ID,这意味着每个文本框都应在点击时显示 ID)。

当我第一次单击任何文本框时,它的值设置正确 - 使用来自服务器数据的 ID。但是当我单击其他文本框时,它们会显示第一次单击文本框的 ID!

我已经尝试了闭包 var 和$.proxy(),但它们似乎不起作用。我已经检查了的内容,并且它们在函数myAttribute的每次迭代中都会发生变化。$.each()但是,该click()事件似乎在“运行时”进行评估并且不会更新。

问题是:

  1. 如何解决我的问题,以便myProcessedAttribute包含正确的数据而不是第一次点击时的数据?
  2. 我觉得我拥有四个嵌套函数的方法可能不是最佳实践。或者是吗?

代码:

$.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({...}) 时,新对话框会替换旧对话框,但我错了。我通过在创建新对话框之前销毁旧对话框解决了这个问题。

更好的解决方案:请参阅下面的答案。

4

1 回答 1

1

创建对话框时调用“create”事件。第二次打开对话框时,不会触发 create 事件,因为该元素上已经存在对话框对象。如果您想在同一个对话框小部件上使用不同的值,请使用“打开”事件。这是一个样本

http://jsfiddle.net/RaWrC/

于 2012-10-10T07:45:23.747 回答