0

我想顯示多個xhr在表視圖中發送的進度。這是我在表格視圖中的第一張照片(由於某種原因,這也不是滾動的),我無法弄清楚將連接條連接到onsendstream的適當方式。我很欣賞我的其他代碼的任何評論。在表格視圖中同時上傳多個Titanium進度條?

my window function

+0

我可能會變得有點困惑,但在那裏的代碼是實際創建的網絡對象?我問這個問題的原因是因爲你聲明你正在嘗試連接'onsendstream',但API文檔至少在KitchenSink示例中使用'ondatastream'來代替? – bh88 2011-06-08 04:40:27

+0

我的XHR在不同的命名空間函數中處理。這部分代碼沒有問題。進度成功傳輸到日誌,我無法找到更新獨特進度條的方法。 POST發生得很好,當我收到回覆時我收到一個警告對話框。 – 2011-06-08 05:38:59

+0

順便說一句,'ondatastream'似乎用於接收,而'onsendstream'用於發送。請參閱參考資料[此處](http://developer.appcelerator.com/apidoc/mobile/latest/Titanium.Network.HTTPClient-object)。 – 2011-06-08 14:53:00

回答

0

我並不認爲多個同時XHR時是穩定的,但它是在模擬器爲我工作。這個問題更多的是關於特定的UI任務XHR是否異步排隊,但我很欣賞任何關於代碼質量或最佳實踐的反饋。這是我到達的解決方案。

// a namespace for the UI code 
myApp.ui = {}; 

// a function for this window 
myApp.ui.createCameraWindow = function() { 
    var win = Ti.UI.createWindow({ 
     // I have my own custom header 
     title:'', 
    }); 

    var containerView = Ti.UI.createView({ 
     backgroundColor:'#85AAD7', 
    }); 

    var tableQueue = Ti.UI.createTableView({ 
     backgroundColor:'#85AAD7', 
     separatorColor:'#85AAD7', 
     data:photosQueue, // photosQueue is an empty global array 
     width:320 
    }); 

    containerView.add(tableQueue); 

    // device stores the candidate file on the system and sends data 
    Ti.App.addEventListener('photoReady',function(candidate) { 
     // here we an add a caption if we please 
     var captionView = Ti.UI.createView({ 
      backgroundColor:'#FFF' 
     }); 

     var candidateIMG = Ti.UI.createImageView({ 
      // the candidate file was stored with a uniqie identifier called fileStamp 
      // don't forget to change resourcesDirectory to tempDirectory for use on the device 
      image:Ti.Filesystem.getFile(Ti.Filesystem.resourcesDirectory,candidate.fileStamp + '-thumb320.png'), 
      height:367, 
      width:320, 
      top:0, 
      opacity:0.5 
     }); 

     var captionLabel = Ti.UI.createLabel({ 
      text:'caption', 
      color:'#000', 
      top:-180, 
      textAlign:'center', 
      font:{fontSize:50,fontWeight:'bold',fontStyle:'italic',fontFamily:'Cochin'}, 
      opacity:0.5 
     }); 

     var captionBox = Ti.UI.createTextField({ 
      height:35, 
      width:270, 
      textAlign:'center', 
      borderStyle:Titanium.UI.INPUT_BORDERSTYLE_ROUNDED 
     }); 

     var submitButton = Ti.UI.createButton({ 
      title:'Submit', 
      color:'#000', 
      selectedColor:'#FFF', 
      top:220, 
      width:130, 
      height:35 
     }); 

     captionView.add(candidateIMG); 
     captionView.add(captionLabel); 
     captionView.add(captionBox); 
     captionView.add(submitButton); 

     // cover the table view with the temporary caption prompt 
     containerView.add(captionView); 

     submitButton.addEventListener('click',function(){ 
      candidate.caption = captionBox.value; 
      // start the xhr send from another function 
      myApp.remote.createPhoto(candidate); 
      // go back to the table view 
      containerView.remove(captionView); 

      var tempFile = Ti.Filesystem.getFile(Ti.Filesystem.resourcesDirectory,candidate.fileStamp + '-thumb75.png'); 

      var progressBar = Ti.UI.createProgressBar({ 
       width:205, 
       height:50, 
       right:20, 
       min:0, 
       max:1, 
       value:0, 
       style:Titanium.UI.iPhone.ProgressBarStyle.PLAIN, 
       color:'#FFF' 
      }); 

      var thisRow = Ti.UI.createTableViewRow({ 
       backgroundColor:'#FFF', 
       layout:"vertical", 
       height:75, 
       fileStamp:candidate.fileStamp 
      }); 

      // apparently the progress bar needs to be inside a view to align correctly 
      var nestedView = Ti.UI.createView({ 
       height:75, 
       width:320 
      }); 

      var tinyThumb = Ti.UI.createImageView({ 
       image:tempFile, 
       height:75, 
       width:75, 
       left:0 
      }); 

      nestedView.add(tinyThumb); 
      progressBar.show(); 
      nestedView.add(progressBar); 
      thisRow.add(nestedView); 
      photosQueue.push(thisRow); 
      tableQueue.setData(photosQueue); 
     }); 
    }); 

    // the xhr.onsendstream will repeatedly fire this function and send an object containing an id and e.progress 
    Ti.App.addEventListener('streamProgress',function(upload) { 
     // loop through the global queue 
     for (i=0;i<photosQueue.length;i++) { 
      // find the the array object that corresponds to the upload object 
      if (photosQueue[i].fileStamp == upload.id) { 
       // identifiy this object as the tableRow in the UI 
       thisRow = photosQueue[i]; 
       // find its progress bar by knowing the view hierarchy 
       var bar = thisRow.children[0].children[1]; 
       // update the progress bar's value 
       bar.value = upload.progress; 
       // update the entire tableView with new data 
       tableQueue.setData(photosQueue); 
      } 
     } 
    }); 

    // the xhr.onload will fire this function and send an object containing an id and a status code 
    Ti.App.addEventListener('confirmation',function(upload) { 
     // loop through the global queue 
     for (i=0;i<photosQueue.length;i++) { 
      // find the the array object that corresponds to the upload object 
      if (photosQueue[i].fileStamp == upload.id) { 
       // identifiy this object as the tableRow in the UI 
       thisRow = photosQueue[i]; 
       // if the POST was successful 
       if (upload.status == '201') { 
        // then make the entire row pleasing 
        thisRow.backgroundColor = 'green'; 
       } else { 
        // otherwise make it ugly 
        thisRow.backgroundColor = 'red'; 
       } 
       // identify the full progress bar in the view hierarchy 
       var bar = thisRow.children[0].children[1]; 
       // remove it regardless 
       thisRow.children[0].remove(bar); 
       // update the entire tableView with new data 
       tableQueue.setData(photosQueue); 
      } 
     } 
    }); 

    win.add(containerView); 

    return win; 
};