2009-09-24 47 views
0

我有这个问题,我在这个选择组上做了一个.each(),对于每一个它触发一个调用服务器的一些数据来填充它。然而,我不明白为什么它只会填充最底层。然后我扔了一些警报(),并意识到它只是多次运行最后一个回调函数。我意识到,到第一次JSON调用完成时,$(this)是不同的......我怎么才能让它等待,所有这些都会被正确的调用填充?

这里是SCRIPT部分:

var thisbundle; 
    var testcount = 0; 

    //get bundle options first.. 
    $("select.bundle").each(function(){ 

      thisbundle = $(this); 
     testcount++; 
      var url = "/order/getpricing/" + thisbundle.attr("id"); 

     //clear it out... 
      //thisbundle.children().remove(); 

     var passbundle = thisbundle; 
      $.getJSON(url, function(data, passbundle){ 
       var options = ''; 
       for(n = 0; n < data.length; n++){ 
        options += '<option value="' + data[n].volumeID + '">' + explainPricing(data, n) + '</option>'; 

        } 
       passbundle.html(options); 
     }); 
    }); 

这里是组成部分:

<div id="bundles"> 
<table> 
    <%foreach (KODmvc.Models.Product prod in Model.products) 
     {%> 
      <%if (prod.NumberOfCourses > 1) 
       { %> 
       <tr><td><img src="<%=prod.Icon %>" /></td><td><b><%=prod.Title%></b><br /><%=prod.Description%></td><td><select class="bundle" id="<%=prod.ProductID %>"><option value="-1">None</option>"</select></td></tr> 
      <%} %> 
    <%} %> 
    </table> 
</div> 
+1

您需要显示一些代码才能回答。但是,一般情况下,通过捕获本地变量中想要的值来解决这类问题。 –

+0

现在看代码:) – BigOmega

回答

2

申报thisbundle在你的功能,而不是在全球范围内:

$("select.bundle").each(function(){ 
    var thisbundle = $(this); 
    // … 
}); 

否则全局对象将在每次迭代回调函数会再使用被覆盖。

+0

是不是有其他方法? – BigOmega

+0

更改了我的答案。 – Gumbo

+0

谢谢,这工作,有趣我之前尝试过,我认为它没有工作,但我认为这是因为我发现我引用了一个属性错误的方式,所以我认为$(this)不是$(this )我以为这是... – BigOmega

3

括在这样一个匿名函数Ajax调用。这会为每个选择元素创建一个新的闭包。每个关闭都会记住它自己的值为passbundle

$("select.bundle").each(function(){ 
    thisbundle = $(this); 
    testcount++; 
    var url = "/order/getpricing/" + thisbundle.val(); 
    alert(thisbundle.id); 

    //clear it out... 
    //thisbundle.children().remove(); 

    (function(){ 
     var passbundle = thisbundle; 
     $.getJSON(url, function(data, passbundle){ 
      var options = ''; 
      for(n = 0; n < data.length; n++){ 
       options += '<option value="' + data[n].volumeID + '">' + explainPricing(data, n) + '</option>'; 
      } 
      passbundle.html(options); 
     }); 
    })(); 

}); 
+0

如果我停止使用passbundle,我仍然可以使用此捆绑包吗? – BigOmega

+1

它不会工作。每次运行外循环时,您都会看到此捆绑器的值发生更改。由于范围的原因,你的内部函数带有一个'实时'指向这个变量的指针。当你的事件处理程序运行时,'thisbundle'变量的值将是它的最后一个值。 –

+0

但我注意到passbundle没有正常工作,说它没有.html,我认为这是因为$(this)在内部变成了一个JSON调用? – BigOmega

1

你也可以使用async:false,虽然如果你正在循环,那可能是错误的方向。但值得一看。