Одна из проблем, с которой вы можете столкнуться с плагином FileTransfer, заключается в том, что он позволяет вам выполнять только одну передачу за раз. Вы можете обойти это, используя XHR2 (для загрузки в любом случае), но я подумал, что было бы неплохо продемонстрировать, как работать с несколькими передачами, используя обещания. Плагин FileTransfer по умолчанию не использует обещания, но, к счастью, вы можете просто использовать ngCordova и использовать обещанную (это слово) версию плагина.
Для этой демонстрации я использую Ionic и ngCordova, хотя теоретически вы можете использовать ngCordova без Ionic. Я создал новое приложение с пустым шаблоном. Затем я использовал bowser для установки ngCordova, который на самом деле не был необходим, поскольку CLI поддерживает его добавление:
@raymondcamden @Ionicframework Уже там! Просто нужно документировать это. ионная добавка ngCordova
— uoʇƃuıʇɹɐɥ ǝʞıɯ (@mhartington)
13 апреля 2015 г.
Затем я сделал следующую демонстрацию. Мне не нравится помещать все в один файл JS для моих проектов Angular, но, поскольку это всего лишь демонстрация, я думаю, это нормально.
angular.module('starter', ['ionic','ngCordova']) .config(['$compileProvider', function($compileProvider) { $compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|mailto|content|file|assets-library):/); }]) .controller('Main', ["$ionicPlatform", "$cordovaFileTransfer", "$q", "$scope", function($ionicPlatform, $cordovaFileTransfer, $q, $scope) { console.log("running Main controller"); $scope.images = []; $ionicPlatform.ready(function() { //resources to download var resources = [ "https://placekitten.com/g/200/300", "https://placekitten.com/g/200/350", "https://placekitten.com/g/400/350", "https://placekitten.com/g/300/200", "https://placekitten.com/g/188/188" ]; var promises = []; resources.forEach(function(i,x) { var targetPath = cordova.file.documentsDirectory + "image"+x+".jpg"; promises.push($cordovaFileTransfer.download(i, targetPath, {}, true)); }); $q.all(promises).then(function(res) { console.log("in theory, all done"); for(var i=0; i<res.length; i++) { $scope.images.push(res[i].nativeURL); } }); }); }]) .run(function($ionicPlatform) { $ionicPlatform.ready(function() { // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard // for form inputs) if(window.cordova && window.cordova.plugins.Keyboard) { cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); } if(window.StatusBar) { StatusBar.styleDefault(); } }); });
Хорошо, давайте возьмем это сверху. Во-первых, блок config как раз предназначен для файловых URI в моем домике. Angular немного анальный (хорошо, безопасный) о том, что он позволяет для URL изображения. Следующий бит — мой контроллер, Майн. У меня есть 5 URL для разных котят на placekitten.com. Я создаю массив для хранения своих обещаний, а затем просто зацикливаюсь на URL. Для каждого я вызываю метод загрузки файлов с переносом в ngCordova. Поскольку он возвращает обещание, я получаю массив обещаний.
Наконец, я использую метод all Angular для их библиотеки $ q, чтобы просто сказать: «Сделайте это, когда они все будут готовы». Затем я помещаю окончательные URL-адреса в массив, который используется в моем представлении. Вот index.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
<title></title>
<link href="lib/ionic/css/ionic.css" rel="stylesheet">
<link href="css/style.css" rel="stylesheet">
<!-- IF using Sass (run gulp sass first), then uncomment below and remove the CSS includes above
<link href="css/ionic.app.css" rel="stylesheet">
-->
<!-- ionic/angularjs js -->
<script src="lib/ionic/js/ionic.bundle.js"></script>
<script src="lib/ngCordova/dist/ng-cordova.js"></script>
<script src="cordova.js"></script>
<!-- your app's js -->
<script src="js/app.js"></script>
</head>
<body ng-app="starter">
<ion-pane>
<ion-header-bar class="bar-stable">
<h1 class="title">Ionic Blank Starter</h1>
</ion-header-bar>
<ion-content ng-controller="Main">
<div ng-repeat="img in images">
<img ng-src="{{img}}">
</div>
</ion-content>
</ion-pane>
</body>
</html>
Вот и все. Результатом является набор изображений кошек, которые, честно говоря, это то, что все приложения должны в конечном итоге:
Подобный код будет работать и для загрузки. Опять же, вам не нужно использовать Ionic / ngCordova для этого. Вы можете создавать свои собственные обещания и делать это вручную, выполняя немного больше работы. (У меня есть видео по отложенным и jQuery, которое может сделать это проще для вас.)