Конечно, есть много таких подходов, как синхронный запрос, обещание, но из моего опыта я думаю, что вы должны использовать подход обратного вызова. Естественно, что асинхронное поведение Javascript. Итак, ваш фрагмент кода можно переписать немного иначе:
function foo() {
var result;
$.ajax({
url: '...',
success: function(response) {
myCallback(response);
}
});
return result;
}
function myCallback(response) {
// Does something.
}
Прежде всего, вы не можете «скрыть / не публиковать» ссылку в приложении с веб-технологией (HTML / CSS / JavaScript). Загрузки обрабатываются клиентом, поэтому URL-адрес Download / Link должен быть общедоступным. Вы можете попытаться «скрыть» защитные параметры, например, Идентификаторы в URL-адресе загрузки с использованием бэкэнда, исполняемого языка программирования, такого как «PHP или node.js и т. Д.». Таким образом вы можете создать hash
URL, например http://www.myside.com/download/359FTBW!S3T387IHS
, чтобы скрыть параметры, такие как recordId
в вашем URL-адресе.
Зная это, ваше решение довольно легко. Просто используйте атрибут HTML для загрузки , например <a href="http://mydownloadurl" download>link text</a>
, чтобы заставить браузер загружать источник href
. Здесь нет ng-click
. К сожалению, атрибут download
не поддерживается браузером Safari. Это не имеет большого значения, когда браузер обрабатывает загрузку. В зависимости от конфигурации операционной системы пользователей файл будет загружен или открыт непосредственно в программе, установленной в этой системе. Например, файл PDF будет открыт в приложении PDF Viewer, если доступно какое-либо приложение для просмотра PDF.
Я написал Plunker , который обрабатывает ng-href
в контроллере AngularJS $scope
. Я надеюсь, что это то, что вам нужно.
Ваш контроллер:
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope) {
$scope.fileHref = 'http://www.analysis.im/uploads/seminar/pdf-sample.pdf';
});
Ваш взгляд:
<head>
<meta charset="utf-8" />
<title>AngularJS Plunker</title>
<script>
document.write('<base href="' + document.location + '" />');
</script>
<link rel="stylesheet" href="style.css" />
<script data-require="angular.js@1.3.x" src="https://code.angularjs.org/1.3.14/angular.js" data-semver="1.3.14"></script>
<script src="app.js"></script>
</head>
<body ng-controller="MainCtrl">
<a ng-href="fileHref" download="yourFilename">Download</a>
</body>
</html>
Я должен был достичь функциональности. Также необходимо убедиться, что он работает для всех основных поддерживаемых браузеров. Вот решение для тех же !!!
Happy Coding !!!
Ваш просмотр / HTML
<a target="_self" class="ui right floated btn btn-warning" href ng-click="downloadInvoice()"> Download </a>
Ваш контроллер
$scope.downloadInvoice = function () {
$http.post(url,requestData, {responseType:'arraybuffer',headers:header
})
.success(function (response) {
var file = new Blob([response], {type: 'application/pdf'});
var isChrome = !!window.chrome && !!window.chrome.webstore;
var isIE = /*@cc_on!@*/false || !!document.documentMode;
var isEdge = !isIE && !!window.StyleMedia;
if (isChrome){
var url = window.URL || window.webkitURL;
var downloadLink = angular.element('<a></a>');
downloadLink.attr('href',url.createObjectURL(file));
downloadLink.attr('target','_self');
downloadLink.attr('download', 'invoice.pdf');
downloadLink[0].click();
}
else if(isEdge || isIE){
window.navigator.msSaveOrOpenBlob(file,'invoice.pdf');
}
else {
var fileURL = URL.createObjectURL(file);
window.open(fileURL);
}
})
};