Titanium传递数据以创建HTMLClient

时间:2014-12-08 22:13:14

标签: javascript titanium titanium-mobile

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

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

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

如何将当前行传递给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();
  }
}

2 个答案:

答案 0 :(得分:1)

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

但我建议采用以下方法。 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;
    };
  }

答案 1 :(得分:0)

所以我很有创意,想出了另一个答案。

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

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

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

从那以后,问题是用数据更新行......