2011-08-18 58 views
0
function createTextFields(obj) { 
    for (var i = 0; i < obj.length; i++) { 
     var dataDump = {}; 
     for (var key in obj[i]) { 
      var textField = Ti.UI.createTextField(pm.combine($$.labelBrown, { 
      left: 200, 
      height:35, 
      value:obj[i][key], 
      width:550, 
      keyboardType:Ti.UI.KEYBOARD_NUMBER_PAD, 
      layout:'horizontal', 
      backgroundColor:'transparent', 
      id:i 
     })); 

      dataDump[key] = textField.value; 
      var callback = function (vbKey) { 
        return function (e) { 
         dataDump[vbKey] = e.source.value; 
        }; 
       }(key); 
     } 
     globalData.push(dataDump); 
    } 

} 

我正在使用模擬代碼來添加數據,它工作正常。昨天我的問題,它得到了解決......更新只發生在最後一行,而不是第一個

Last Object is always getting updated?

現在,當我去編輯頁面,它讓我看到四個文本字段或添加的文本字段數......現在,當我編輯的東西,點擊保存...值更新的第四個或最後一個TextFields對象...

+1

如果將所有的'var'聲明移動到函數的頂部,你仍然有問題嗎?因此,創建函數的第一行'var i,dataDump,key,callback;'並在整個函數中刪除所有'var'關鍵字? – DaveRandom

+0

您正在定義'callback'併爲其分配一個函數,但是您沒有在任何地方使用該變量,或者我在這裏丟失了什麼? – nobody

+0

@DaveRandom:它沒有解決問題,數據再次被保存到最後一個對象... –

回答

1

不要在循環內定義函數。計算昂貴並導致問題,像這樣。這裏是一個要解決這個問題的修復:

function createTextFields(obj) { 

    var callback = function (vbKey, localDump) { 
        return function (e) { 
         localDump[vbKey] = e.source.value; 
        }; 
       } 
    var i; 
    var max = obj.length; 
    for (i = 0; i < max; i++) { 
     var dataDump = {}; 
     for (var key in obj[i]) { 
      dataDump[key] = textField.value; 
      var callBackInstance = function(keyn, dataDump); 
     } 
     globalData.push(dataDump); 
    } 

} 
+0

而不評估循環內的'obj.length' – Nemoden

+0

@Nemoden爲什麼不(不是說你應該,只是想知道爲什麼不)?此外,這個回調函數的處理是什麼 - 它似乎沒有被用在任何地方,只是被重新定義了一遍又一遍...... – DaveRandom

+0

我自己也有同樣的問題@DaveRandom(關於回調函數)我種類的假設它被剔除了代碼。 (因爲文本字段來自哪裏) – Matthew

1

JavaScript沒有塊級範圍,所以你的變量dataDumpcallback,儘管「聲明」中的for循環實際上屬於功能。如你所見,你將值保存到dataDump,那麼你每次通過循環時都會覆蓋它。這就是爲什麼最後只有在最後一個值上運行的代碼仍然存在。

請看What is the scope of variables in JavaScript?

相關問題