2016-08-26 11 views
1

さまざまな関数呼び出しを試みましたが、EmberJsでCSVのダウンロードをトリガーする方法がわかりません。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エラーはなく、コンソールログには何も記録されないので、エラーブロックに当たらないことはわかっています。しかし、...それはクライアント上でファイルのダウンロードを引き起こさないでしょう。誰が何が欠けているか知っていますか?

+0

リクエストには特別なものがありますか、それとも単純なURL呼び出しですか?私はdownloadOrdersCSVを呼び出すためにアクション{{action "downloadOrdersCSV"}}を使用しています:function(){window.open( "yoururl"、 '_ blank');} –

答えて

0

私はこれをテストすることができませんが、あなたの問題は約束を返すことです。

はそうするようにコードを変更します。機能の類似した部分を実装するには

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); 
}); 
0

、私は別のルートのために行ってきました。 AJAXリクエストを作成するのではなく、フォームを作成してサーバーに送信します。私のAPIエンドポイントは、レスポンスに適切なContent-Dispositionヘッダーを含む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('') 
},