2011-08-30 132 views
3

由於某種原因,我調用嵌套的jQuery.each()函數正在失去一些變量的作用域,但不是其他變量。在下面的代碼中,Client.KNE參考起作用,但ClientDiv不起作用,即使在此之前,它們都是已定義的,已填充的變量...Jquery .each()範圍問題(bug?)

通過將Client和ClientDiv切換到全局變量,我覺得我不應該在這裏創建全局變量...

不起作用:

jQuery.each(Messages.Additions, function (clientIndex) { 
    var Client = Messages.Additions[clientIndex]; 
    var ClientDiv = $("#clientTitle_" + Client.ClientID); 

    if (ClientDiv.length == 0) { 
     $("#ClientTemplate").tmpl(Client).appendTo("#ClientContainer"); 
    } else { 
     jQuery.each(Client.KNE, function (kneIndex) { 
      var KNE = Client.KNE[kneIndex];      // Works 
      var KNEDiv = ClientDiv.find("#kneTitle_" + KNE.KNE); // DOES NOT WORK 

不工作:

jQuery.each(Messages.Additions, function (clientIndex) { 
    Client = Messages.Additions[clientIndex]; 
    ClientDiv = $("#clientTitle_" + Client.ClientID); 

    if (ClientDiv.length == 0) { 
     $("#ClientTemplate").tmpl(Client).appendTo("#ClientContainer"); 
    } else { 
     jQuery.each(Client.KNE, function (kneIndex) { 
      KNE = Client.KNE[kneIndex];      // Works 
      KNEDiv = ClientDiv.find("#kneTitle_" + KNE.KNE); // Works 

任何人都知道我是什麼在第一版中做錯了?或者這是一個錯誤?爲什麼一個變量工作,但另一個不...

從這裏:Jquery $().each method obscures 'this' keyword它看起來像我可以傳遞變量到函數調用,但我應該嗎?

試過上面的鏈接,並且它不工作:

jQuery.each(Messages.Additions, function (clientIndex) { 
    var Client = Messages.Additions[clientIndex]; 
    var ClientDiv = $("#clientTitle_" + Client.ClientID); 

    if (ClientDiv.length == 0) { 
     $("#ClientTemplate").tmpl(Client).appendTo("#ClientContainer"); 
    } else { 
     jQuery.each(Client.KNE, function (kneIndex, Client, ClientDiv) { 
      var KNE = Client.KNE[kneIndex]; 
      var KNEDiv = ClientDiv.find("#kneTitle_" + KNE.KNE); //Does not work - ClientDiv undefined 

類似的問題沒有滿意的答案: Scope of jQuery each() function?

SOLUTION

$.each(Messages.Additions, function() { 
    var $Client = this; 
    var $ClientDiv = $("#clientTitle_" + $Client.ClientID); 

    if (!$ClientDiv.length) { 
     $("#ClientTemplate").tmpl($Client).appendTo("#ClientContainer"); 
    } else { 
     $.each($Client.KNE, function() { 
      var $KNE = this; 
      var $KNEDiv = $ClientDiv.find("#kneTitle_" + jq($KNE.KNE));  
      // SWITCHED TO $ PREFIX 
+1

不應該是「.find()」與一個小寫的f? – Blazemonger

+0

好的,我發佈它後,我確實在這裏修正了我的代碼。不幸的是,這不是我的問題的原因,雖然;-) –

+0

請閱讀「**當問一個JavaScript的問題,你應該**」部分[這裏](http://stackoverflow.com/tags/javascript/info) – thorn

回答

3

你可以試試這個使用this指向當前項目的關鍵字循環。而不是檢查if (ClientDiv == null)您應該檢查if (ClientDiv.length > 0),因爲jQuery返回空對象,如果它沒有找到該元素,以便檢查將失敗。

var additions; 
jQuery.each(Messages.Additions, function() { 
    var $clientDiv = $("#clientTitle_" + this.ClientID); 

    if ($clientDiv.length == 0) { 
     $("#ClientTemplate").tmpl(Client).appendTo("#ClientContainer"); 
    } else { 
     jQuery.each(Client.KNE, function() { 
      $clientDiv.find("#kneTitle_" + this.KNE); 
     }); 
    } 
}); 
+0

感謝您檢查空指針。但是,我沒有看到您的代碼如何幫助我避免在每個子循環中重新選擇ClientDiv。對Client的引用是可以工作的部分,ClientDiv失敗了,大概我不得不使用Additions/Client引用來重新選擇? –

+0

我編輯的答案應該可以工作。你可以試試嗎? – ShankarSangoli

+0

這確實有效Shankar。在變量之前添加$是做什麼的?這只是使它成爲一個全局變量? –