钛传递数据以创建HTTPClient



我有一个循环,可以从请求中解析JSON,并生成一个表。现在需要下载该表上的图像,这就是我使用 createHTTPClient 请求来获取图像的原因。

问题是,我想在下载图像时实时更新行。

但是由于创建HTTPClient是异步的,它无法做到这一点......它总是得到最后一行...

如何将当前行传递给 onload 事件?

我的代码是这样的:

onload: function(e) {
asjson = JSON.parse(this.responseText);
for (var i=0;i<asjson.objects.length;i++){
  var fname = asjson['objects'][i].photos[0].photo;
  var file = Titanium.Filesystem.getFile(Titanium.Filesystem.applicationDataDirectory, fname);
  var row = Ti.UI.createTableViewRow({
        title : asjson['objects'][i].name,
        hasChild : true,
        color: 'white',
        albumid : asjson['objects'][i].id,
        songid : asjson['objects'][i].id,
        id :  asjson['objects'][i].staff[0].id,
        idtype : 1
  });

  if (!file.exists()) {
var c = Titanium.Network.createHTTPClient();
    c.setTimeout(10000);
    c.open('GET','http://localhost:8000/' + fname);
    c.file = Titanium.Filesystem.getFile(Titanium.Filesystem.applicationDataDirectory, fname);
    c.onload = function(e){        
        file = Titanium.Filesystem.getFile(Titanium.Filesystem.applicationDataDirectory, fname);
        row.leftImage =  f1 = Titanium.Filesystem.applicationDataDirectory + '/' + fname;
    };
    c.send();
  }
}

所以你在这里有几个不同的选择。您可以提前创建所有行。然后,加载图像后,在表格上循环查找正确的行并设置图像。

但是,我建议采用以下方法。JSLint 网站很好地解释了为什么在循环中添加函数是一个坏主意。JSLint

onload: function(e){
  var asJson = JSON.parse(this.responseText);
  for(var i = 0, length = asJson.objects.length; i < length; i++){
    var fileName = asjson.objects[i].photos[0].photo;
            var file = Titanium.Filesystem.getFile(Titanium.Filesystem.applicationDataDirectory, fileName);
    var fileId = asJson.objects[i].id;
    var row = Ti.UI.createTableViewRow({
        title : asJson.objects[i].name,
        hasChild : true,
        color: 'white',
        albumid : fileId,
        songid : fileId,
        id :  asJson.objects[i].staff[0].id,
        idtype : 1
        });
    if(!file.exists()){
     var c = Titanium.Network.createHTTPClient();
      c.setTimeout(10000);
      c.open('GET','http://localhost:8000/' + fileName);
      c.file = Titanium.Filesystem.getFile(Titanium.FileSystem.applicationDataDirectory,fileName);
      c.onload = rowImageOnLoadHandler(row,fileName);
      c.send();
    }
  }      
}

请注意 rowOnLoadHandler 函数。此函数将允许您保留对运行 HTTPClient 请求的行的引用。

   function rowImageOnLoadHandler(row,fileName){
    return function(){
      row.leftImage = Titanium.Filesystem.applicationDataDirectory + '/' + fileName;
    };
  }

所以我发挥了创造力,想出了另一个答案。

基本上,我将行号附加到 url:

c.open('GET','http://localhost:8000/' + fileName + '?i=' + i);

然后,我可以使用 this.location 访问位置属性。

从那里开始,就是用数据更新行的问题......

最新更新