2011-08-18 60 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?

相关问题