Javascript 在EmberJs中下载CSV文件
我尝试了无数不同的函数调用,但似乎不知道如何在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
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”);}