2015-09-15 57 views
6
//Download SKU logic 
    downloadSku: function (e) { 
    e.preventDefault(); 
    var checkedValues = this.$el.find('.chk:checked').map(function() { 
     return this.value; 
    }).get(); 
    var options = { 
     success: function (model, response) { 
     console.log(response); 
     var blob = new Blob([response], { type: 'application/vnd.ms-excel' }); 

     var downloadUrl = URL.createObjectURL(blob); 
     var a = document.createElement("a"); 
     a.href = downloadUrl; 
     a.download = "downloadFile.xlsx"; 
     document.body.appendChild(a); 
     a.click(); 
     } 
    }; 
    var obj = {}; 
    obj["sku_ids"] = checkedValues; 
    this.downloadSkuModel.set(obj, { validate: true }); 
    this.downloadSkuModel.save({}, options); 

    } 

services.js下載Excel電子表格在Backbone.js的

var services = { 

    sync: function (method, model, options) { 
     var self = this; 
     var api_token = mainJs.get_api_token(); 
     var access_token; 
     if (api_token == null) { 
      access_token = api_token; 

     } else { 
      access_token = api_token.access_token; 
     } 

     options || (options = {}); 

     var beforeSend = options.beforeSend; 
     options.beforeSend = function (xhr) { 
      xhr.setRequestHeader('Authorization', 'Bearer ' + access_token) 
      if (beforeSend) return beforeSend.apply(this, arguments); 
     }; 

     switch (method) { 
      case "read": 
       options.url = options.readUrl; 
       break; 
      case "delete": 
       options.url = options.deleteUrl; 
       break; 
      case "update": 
       options.url = options.updateUrl; 
       options.contentType = 'application/json'; 
       break; 
      case "create": 
       options.url = options.createUrl; 
       options.contentType = 'application/json'; 
       break; 
     } 

     options.error = function (xhr, statusTxt, thrown) { 
      switch (xhr.status) { 
       case 401: 
        console.log("Unauthorized error"); 
        break; 
       default: 
        var messageText = JSON.parse(xhr.responseText);; 
        console.log("Status code: " + xhr.status + " Error: " + messageText.message); 
      } 

     } 

     if (options.url) 
      return Backbone.sync.call(model, method, model, options); 

    } 

} 


module.exports = services; 

我的響應頭:

HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
Access-Control-Allow-Origin: * 
X-Content-Type-Options: nosniff 
X-XSS-Protection: 1; mode=block 
Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
Pragma: no-cache 
Expires: 0 
Strict-Transport-Security: max-age=31536000 ; includeSubDomains 
X-Frame-Options: DENY 
Content-Disposition: attachment;filename=sku_list.xlsx 
Content-Type: application/octet-stream;charset=UTF-8 
Transfer-Encoding: chunked 
Date: Tue, 15 Sep 2015 14:56:58 GMT 

我正在從服務器的響應,但它不是在查看未來。

如果我在我看來,使用JavaScript它的工作原理:

var obj = {}; 
    obj["sku_ids"] = checkedValues; 
    var xhr = new XMLHttpRequest(); 
    xhr.open('POST', Urls.sku.download, true); 
    xhr.responseType = 'blob'; 

    xhr.setRequestHeader("Authorization", "Bearer " + "somethign"); 
    xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8'); 
    xhr.onload = function (e) { 
     if (this.status == 200) { 
     var blob = new Blob([this.response], { type: 'application/vnd.ms-excel' }); 
     var downloadUrl = URL.createObjectURL(blob); 
     var a = document.createElement("a"); 
     a.href = downloadUrl; 
     a.download = "downloadSku.xlsx"; 
     a.setAttribute("data-bypass", ""); 
     document.body.appendChild(a); 
     a.click(); 
     } else { 
     alert('Unable to download excel.') 
     } 
    }; 
    xhr.send(JSON.stringify(obj)); 

我與骨幹正的錯誤是如下:

SyntaxError: Unexpected token P at Object.parse (native) at K.parseJSON 
+0

什麼'sync'事件?它會起火嗎? –

+0

是的,它觸發,但它涉及到錯誤的一部分,但有200 OK – vini

+0

你可以發佈你在'services.js'中接收到的原始JSON'xhr.responseText'嗎? –

回答

3

我解決我的問題:

這就是我做的

我改變了我的options.dataType = 'text'因爲默認情況下backbone是假設它是一個JSON響應,並做了Object.parse