2012-11-21 51 views
0

我無法理解這裏出現了什麼問題。我從數據庫中獲取事件列表,並試圖創建一個自定義列表來顯示它們,並帶有一個回調onclick方法。我得到正確的值,我正確顯示它們,但onClick方法獲取最後一個項目ID的值,而不是它自己的值。JavaScript中的意外參數值

所以,如果我點擊任何項目列表中的我警告說

show itinerary for event: 10

而不是正確的ID(我現在有10個事件)

這是我如何處理我從數據庫得到項目:

function gotEvents(transaction, result) { 
      var eventList; 
      var myDbElements = $('#myDbElements');    
      var params = { 
       items:result.rows.length, 
       hasImage:false, 
       content:[] 
      } 
        if (result != null && result.rows != null) { 

         for (var i = 0; i < result.rows.length; i++) { 
          var row = result.rows.item(i); 
          var rowText = row["Name"] + '<br/>' + row["Start"].slice(0,9);      


          var rowId = row["id"]; 
          var contentItems = { 
          text: rowText, 
          onClick: function(){ showEventItinerary(rowId) } 

          } 
          params.content.push(contentItems);      
          } 
          for (var j=0; j<result.rows.length;j++){ 
          PrecAppPersistence.debugObject(params.content[i]); 
          } 
          eventList = PrecAppComponents.myList(params,$('#eventsList')); 
        } 
       PrecApp.I_SCROLL.refresh(); 
       } 


      function showEventItinerary(event_ID) { 
       alert("show itinerary for event:"+event_ID); 
      } 

這裏是我如何創建我的列表:

function List() { 

var self; 
var items; 
var firstRun = true; 

this.initialize = function(params,cont) { 
    self = this; 
    var container = cont; 

    var items; 
    container.empty(); 
    opt = { 
      items:0, 
      content:[], // array with the content. Default is = {text:text,icon:imageURL,onClick: function(){}} itemId // not sure if we need this yet. supposed to be a manual ID for the item. EX: id taken from the db.           
      width: 300, 
      hasImage: false, //set true if you want to show an images 
      margin:10, //margin between items    


    } 
    for (i in params) opt[i] = params[i]; 

    items = opt.items; 
    container.width(opt.width); 

    for (i=0;i<items;i++){ 

     itemToAdd = '<div class="listItem" id="listItem'+i+'">'; //add IDS to add click       
     if (opt.hasImage) { 
      itemToAdd += "<img src=" + opt.content[i].image + " />"; 
     }    
     itemToAdd += "<p>" + opt.content[i].text + "</p>"; 
     itemToAdd += "<div class='clearFix'></div>"; 
     itemToAdd += '</div>';  
     container.append(itemToAdd); //original #scroller might change?  

     listItem = $('#listItem'+i);  
     listItem.css('margin',opt.margin + 'px 0'); 
     listItem.on('click',opt.content[i].onClick);    

    } 


}} 

我記錄我的變量,我的rowId有正確的ID。並將OnClick日誌中顯示的所有項目如下:

onClick:function(){ showEventItinerary(rowId)}(?我不知道這是否是正確的,它不應該表現出ROWID,而不是ROWID變量的值)

我錯過這裏有什麼?

感謝

回答

1

你需要創建一個封閉,作爲你的索引i獲取與循環更新時間:

for (var i = 0; i < result.rows.length; i++) {(function(index){ 
// use index instead of i inside your loop 
... 
// end closure 
})(i); 
// end loop 
} 

自調用函數會以指數被執行=我。我是循環的一部分,它的值會改變,而循環中的每個函數都會保留自己的索引。

+0

我是新來的JavaScript如此,爲了清楚起見,這是有我作爲參數調用自身的功能? – caiocpricci2

+0

@ gameower是正確的,我已經更新了我的答案。 – Christophe

1

對於rowID,沒有使用數組來存儲循環中的每個項目的塊級別作用域,或者使用closure爲每個迭代創建單獨的作用域。

檢查the infamous loop problem

+0

+1爲鏈接,真的幫我理解了!謝謝! – caiocpricci2