jQuery多个内部回调和范围

时间:2012-10-10 07:13:52

标签: javascript jquery scope

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

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

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

问题是:

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

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

    更好的解决方案:见下面的答案。

1 个答案:

答案 0 :(得分:1)

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

http://jsfiddle.net/RaWrC/