Javascript 在EmberJs中下载CSV文件

Javascript 在EmberJs中下载CSV文件,javascript,ajax,csv,ember.js,Javascript,Ajax,Csv,Ember.js,我尝试了无数不同的函数调用,但似乎不知道如何在EmberJs中触发CSV下载 这是我的最新代码: let endpoint = '/api/foo/'; let options = { url: endpoint, type: 'POST', data: {}, dataType: 'text' }; return new Ember.RSVP.Promise((resolve, reject) => { options.success = functi

我尝试了无数不同的函数调用,但似乎不知道如何在EmberJs中触发CSV下载

这是我的最新代码:

let endpoint = '/api/foo/';
let options = {
    url: endpoint,
    type: 'POST',
    data: {},
    dataType: 'text'
};
return new Ember.RSVP.Promise((resolve, reject) => {
  options.success = function(result) {
      var uri = 'data:application/csv;charset=UTF-8,' + encodeURIComponent(result);
      window.open(uri, 'foo.csv');
  };
  options.error = (xhr, errorThrown) => {
    console.log('error');
    // return Ember.run(null, reject, this.didError(xhr, xhr.status, xhr.responseJSON, 1));
  };
  Ember.$.ajax(options);
});

此代码不会引发任何服务器端或客户端错误。它得到了200的回复。没有javascript错误,也没有控制台日志,所以我知道它没有遇到错误块。但是它不会触发客户端上的文件下载。有人知道遗漏了什么吗?

我无法测试这一点,但我相信您的问题在于返回新的承诺,而您真正想要的是返回承诺本身

因此,请将代码更改为:

let endpoint = '/api/foo/';
let options = {
    url: endpoint,
    type: 'POST',
    data: {},
    dataType: 'text'
};
return Ember.RSVP.Promise((resolve, reject) => {  // note the deletion of new
  options.success = function(result) {
      var uri = 'data:application/csv;charset=UTF-8,' + encodeURIComponent(result);
      window.open(uri, 'foo.csv');
  };
  options.error = (xhr, errorThrown) => {
    console.log('error');
    // return Ember.run(null, reject, this.didError(xhr, xhr.status, xhr.responseJSON, 1));
  };
  Ember.$.ajax(options);
});

我无法测试这一点,但我相信您的问题在于返回
新的
承诺,而您真正想要的是返回承诺本身

因此,请将代码更改为:

let endpoint = '/api/foo/';
let options = {
    url: endpoint,
    type: 'POST',
    data: {},
    dataType: 'text'
};
return Ember.RSVP.Promise((resolve, reject) => {  // note the deletion of new
  options.success = function(result) {
      var uri = 'data:application/csv;charset=UTF-8,' + encodeURIComponent(result);
      window.open(uri, 'foo.csv');
  };
  options.error = (xhr, errorThrown) => {
    console.log('error');
    // return Ember.run(null, reject, this.didError(xhr, xhr.status, xhr.responseJSON, 1));
  };
  Ember.$.ajax(options);
});

在实现类似的功能时,我选择了不同的路线。我没有创建AJAX请求,而是创建一个表单并将其提交给服务器。然后,我的API端点将在响应中返回CSV,并带有适当的内容处置头,浏览器将只下载该文件

(根据您的身份验证方案,您可能必须将身份验证令牌作为值包含在表单数据中)

下面是示例代码。您将看到我正在添加身份验证令牌。表单的操作URL是在页面的标记中设置的,但是如果需要,可以在此处动态设置

csvDownload () {
    let form = Ember.$('#csvdownloadform')
    let input = Ember.$('#csvdownloadtoken')
    input.val(this.get('session').get('session.content.authenticated.token'))
    form.submit()
    input.val('')
    form_func.val('')
},

在实现类似的功能时,我选择了不同的路线。我没有创建AJAX请求,而是创建一个表单并将其提交给服务器。然后,我的API端点将在响应中返回CSV,并带有适当的内容处置头,浏览器将只下载该文件

(根据您的身份验证方案,您可能必须将身份验证令牌作为值包含在表单数据中)

下面是示例代码。您将看到我正在添加身份验证令牌。表单的操作URL是在页面的标记中设置的,但是如果需要,可以在此处动态设置

csvDownload () {
    let form = Ember.$('#csvdownloadform')
    let input = Ember.$('#csvdownloadtoken')
    input.val(this.get('session').get('session.content.authenticated.token'))
    form.submit()
    input.val('')
    form_func.val('')
},

您的请求有什么特别的地方吗?还是只是一个简单的url调用?我正在使用一个动作{action“downloadOrdersCSV”}来调用downloadOrdersCSV:function(){window.open(“yoururl”,“_blank”);}您的请求有什么特殊的地方吗,还是只是一个简单的url调用?我正在使用一个动作{action“downloadOrdersCSV”}来调用downloadOrdersCSV:function(){window.open(“yoururl”,“u blank”);}