2012-06-08 87 views
1

我有一個奇怪的問題與我正在使用的骨幹集合的提取。在我的代碼的一個特定實例中,我執行一次提取(具體如何在代碼的其他區域中執行操作,這些代碼都可以正常工作),但提取似乎從未將其提交給服務器,並且開發人員工具將請求顯示爲紅色單詞(取消)在狀態/文本字段中。Backbone collection fetch error with no information

我已經走過了這個到骨幹同步方法,我看到正在建立的$ .ajax和一切看起來不錯。有沒有人遇到這個問題?

這裏是我的代碼,如果它有幫助,這是一個函數,它調用兩個.ashx服務首先檢查文件的存在,然後打開它。這是不是爲我工作的一部分是「me.collection.fetch()

openDocument: function() { 
     var me = this, 
       fileId = me.model.get('id'), 
      userId = Dashboard.Data.Models.UserModel.get("UserInfo").User_ID, 
      fileRequest = '/genericHandlers/DownloadFile.ashx?id=' + fileId + '&userId=' + userId, 
      fileCheck = '/genericHandlers/CheckFileExistance.ashx?id=' + fileId + '&userId=' + userId; 

     //hide tooltip 
     me.hideButtonTooltips(); 

     // Check for file existance 
     $.ajax({ 
      url: fileCheck 
     }) 
     .done(function (data) { 
      if (data && data === "true") { 

       document.location.href = fileRequest; 

       me.collection.fetch(); 



      } else if (!!data && data === "false") { 
       "This file is no longer available.".notify('error'); 
      } 
     }) 
     .fail(function (data) { 
      "Something went wrong during the File Existance check".notify('error'); 
      "Something went wrong during the File Existance check".log(userId, 'error', 'Docs'); 
     }); 
    }, 

我的收藏:

// docsCollection.js - The collection of ALL the documents available to a given user 

// Document Collection 
Dashboard.Collections.DocsCollection = Backbone.Collection.extend({ 

    model: Dashboard.Models.DocumentUploadModel, 

    url: function() { 
     return 'apps/docs/Docs/' + this.userId; 
    }, 

    initialize: function (options) { 
     this.userId = options.userId; 
     this.deferredFetch = this.fetch(); 

    }, 

    comparator: function (model) { 
     return -(new Date(model.get('expirationDate'))); 
    }, 

    getDaysSinceViewedDocuments: function() { 
     return this.filter(function (model) { 
      return model.get('daysSinceViewed') !== null; 
     }); 
    }, 

    getNewDocuments: function() { 
     return this.filter(function (model) { 
      return model.get('isNew'); 
     }); 
    }, 

    getExpiredDocuments: function() { 
     return this.filter(function (model) { 
      return model.get('isExpired'); 
     }); 
    } 

}); 

和我的模型:

Dashboard.Models.DocumentUploadModel = Backbone.Model.extend({ 
    defaults: { 
     fileArray: [], 
     name: '', 
     description: '', 
     accesses: [], 
     tags: [], 
     expirationDate: '' 
    }, 

    initialize: function() { 

      this.set({ 
       userId: Dashboard.Data.Models.UserModel.get("UserInfo").User_ID, 
       expirationDate: (this.isNew()) ? buildExpirationDate() : this.get('expirationDate') 
      }, { silent: true }); 

     function buildExpirationDate() { 
      var date = new Date((new Date()).getTime() + 24 * 60 * 60 * 1000 * 7), 
        dateString = "{0}/{1}/{2}".format(date.getMonth() + 1, date.getDate(), date.getFullYear()); 

      return dateString; 
     } 

    }, 

    firstFile: function() { 
     return this.get('fileArray')[0]; 
    }, 

    validate: function (attributes) { 
     var errors = []; 

     if (attributes.name === '' || attributes.name.length === 0) 
      errors.push({ 
       input: 'input.txtName', 
       message: "You must enter a name." 
      }); 

     if (attributes.description === '' || attributes.description.length === 0) 
      errors.push({ 
       input: 'textarea.taDescription', 
       message: "You must enter a description." 
      }); 

     if (errors.length > 0) 
      return errors; 

     return; 
    }, 

    sync: function (method, model, options) { 
     var formData = new FormData(), 
       files = model.get("fileArray"), 
       $progress = $('progress'), 
       success = options.success, 
       error = options.error; 

     // Nothing other than create or update right now 
     if (method !== "create" && method !== "update") 
      return; 

     // Build formData object 
     formData.append("name", model.get("name")); 
     formData.append("description", model.get("description")); 
     formData.append("accesses", model.get("accesses")); 
     formData.append("tags", model.get("tags")); 
     formData.append("expirationDate", model.get("expirationDate")); 
     formData.append("userId", model.get("userId")); 
     formData.append("isNew", model.isNew()); 

     // if not new then capture id 
     if (!model.isNew()) 
      formData.append('id', model.id); 


     for (var i = 0; i < files.length; i++) { 
      formData.append('file', files[i]); 
     } 

     xhr = new XMLHttpRequest(); 

     xhr.open('POST', '/genericHandlers/UploadDocsFile.ashx'); 


     xhr.onload = function() { 
      if (xhr.status === 200) { 
       if (success) 
        success(); 
      } else { 
       if (error) 
        error(); 
      } 
     } 

     if ($progress.length > 0) { 
      xhr.upload.onprogress = function (evt) { 
       var complete; 

       if (evt.lengthComputable) { 
        // Do the division but if you cant put 0 
        complete = (evt.loaded/evt.total * 100 | 0); 
        $progress[0].value = $progress[0].innerHTML = complete; 
       } 
      } 
     } 



     xhr.send(formData); 
    }, 

    upload: function (changedAttrs, options) { 
     this.save("create", changedAttrs, options); 
    } 

}); 

回答

1

你」在嘗試取回您的收藏集之前,請重新指定document.location.href的值:

document.location.href = fileRequest; 
me.collection.fetch(); 

更改document.location.href將更改整個頁面,並且在此過程中,任何當前正在運行的JavaScript都將關閉,因此我不希望您的me.collection.fetch()被執行。

+0

解釋它!謝謝。 –