上下文
情況如下:用戶可以在應用程序中上傳文件。他們可以隨時(以及多次)完成此操作。檢查例如文件上傳的動態延遲量
我想在任何上傳完成時顯示一個微調,並在當前沒有上傳時刪除它。
我的做法
的上傳是由一個外部文件上傳插件(如blueimp)句柄和它的Add方法我搶jqXHR對象並將其添加到骨幹集合(這是在我的應用程序的圖像,所以我將它與Marionette的收藏視圖結合使用)。
下面是一個叫木偶ItemView控件的OnRender將回調函數的一部分:
// Get the file collection
var uploadFiles = SomeBackBoneCollection;
// Track how many deferreds are expected to finish
var expected = 0;
// When an image is added, get the jqXHR object
uploadFiles.bind('add', function(model) {
// Get jqXHR object and call function which tracks it
trackUploads(model.get('jqXHR'));
// Do something to show the spinner
console.log('start the spinner!');
// Track amount of active deferreds
expected++;
}, this);
// Track the uploads
function trackUploads(jqXHR) {
$.when(jqXHR).done(function(){
// A deferred has resolved, subtract it
expected--;
// If we have no more active requests, remove the spinner
if (expected === 0) {
console.log('disable the spinner!');
}
});
}
討論
此方法效果非常好,但我不知道是否有任何其他(更好)的方法。
您對這種方法有什麼看法?關於這種方法,您是否看到任何上升或下降?任何其他方法或建議任何人?
例如,擁有某種你可以繼續傳遞延遲的數組/對象可能會很好,並且$ .when會以某種方式監視這個集合並解決在任何時候一切都完成的情況。但是,這應該起作用,以便您可以在任何給定時間繼續傳遞延遲對象。
雖然這是很好的方法,但它讓我覺得!這與我的情況並不完全相同,因爲上傳正由(任何)fileuploader插件處理。我從來沒有保存模型,因爲我不需要。我只是通過這種方法跟蹤圖像上傳進度。但是,也許使用保存(並上傳)模型也是一個好方法。在這種情況下,我認爲我只需要一個文件輸入按鈕而不是整個插件;上傳在保存模型中完成。 –
澄清了問題中的一點差異。 –
編輯我的答案更詳細(和另一種方法)。既然你已經在使用集合,爲什麼不使用模型呢?順便說一句,在您的原始方法中,將jqXHR附加到模型不會是一個問題,除非您獲得太多模型...因爲現在所有jqXHR都有它的參考(它的模型),它們將永遠不會被垃圾收集,直到您移除內存中的模型。 –