我有一个从请求中解析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();
}
}
答案 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
访问位置属性。
从那以后,问题是用数据更新行......