Utiliser Angular pour télécharger un fichier via Ajax

J’ai un service qui génère un fichier CSV et le renvoie à la page via un http / ajax get. J’aimerais qu’un utilisateur clique sur un bouton, appelle le service, puis télécharge le fichier dans le navigateur de l’utilisateur.

Je voudrais faire ceci The Angular Way, même si je reconnais que cela peut avoir plus à faire avec Ajax ou le navigateur que Anguler en soi

Le service est en C #, et voici ce qu’il retourne:

return File(Encoding.UTF8.GetBytes(WriteCSV(assetList)), "text/csv", "results.csv"); 

Le code du contrôleur qui appelle le service a l’aspect suivant. Cela fonctionne, mais je ne sais pas quoi faire en cas de succès:

 $scope.exportCSV = function () { $http({ method: "get", url: "ExportCSV" }). error(function (data, status, headers, config) { alert("Error exporting data to CSV."); }); }; 

Vous ne pouvez pas lancer de téléchargement depuis un ajax normal GET ou POST, vous devez utiliser la méthode traditionnelle, par exemple window.location='url' et définir le bon en-tête http avec le type de contenu correct, ce qui ouvrira la boîte de dialog de téléchargement. le navigateur des utilisateurs

Peut-être une méthode plus “angular” consiste-t-elle à ce que votre contrôleur définisse un drapeau pour déclencher le téléchargement, mais place la fonctionnalité principale dans une directive qui construit un élément avec un atsortingbut “download”, et sur l’affichage, un rappel / une surveillance appelle le ng -Cliquez sur.

Par exemple:

 // put this in a template related to a given controller  // controller just needs to sortinggger the directive into action module.controller(..., function($scope){ $scope.downloadready = true; // sortinggger the directive to be created }); // and the directive code will build the element and click the button module.directive('downloader', function ($comstack) { return { ressortingct: 'E', replace: true, // values here can be placed in the template as variables and accessed in link() // but this is shortest to get the idea across template: '', link:function (scope, elm, attrs) { // this clicks the button outside the digest loop which the scope was updated in $timeout(function() { angular.element($('#downloadbtn')).sortingggerHandler('click'); }, 0); } } }); 

Bien que je l’admette, c’est plus déconcertant que de changer de redirection sur window.location.