Статьи

Создание цепочки нескольких передач файлов Cordova с помощью ngCordova

Одна из проблем, с которой вы можете столкнуться с   плагином FileTransfer, заключается в том, что он позволяет вам выполнять только одну передачу за раз. Вы можете обойти это, используя XHR2 (для загрузки в любом случае), но я подумал, что было бы неплохо продемонстрировать, как работать с несколькими передачами, используя обещания. Плагин FileTransfer по умолчанию не использует обещания, но, к счастью, вы можете просто использовать  ngCordova  и использовать обещанную (это слово) версию плагина.

Для этой демонстрации я использую Ionic и ngCordova, хотя теоретически вы можете использовать ngCordova без Ionic. Я создал новое приложение с пустым шаблоном. Затем я использовал bowser для установки ngCordova, который на самом деле не был необходим, поскольку CLI поддерживает его добавление:

Затем я сделал следующую демонстрацию. Мне не нравится помещать все в один файл 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>

Вот и все. Результатом является набор изображений кошек, которые, честно говоря, это то, что все приложения должны в конечном итоге:

Снимок экрана симулятора iOS 13 апреля 2015 г., 11.24.03

Подобный код будет работать и для загрузки. Опять же, вам не нужно использовать Ionic / ngCordova для этого. Вы можете создавать свои собственные обещания и делать это вручную, выполняя немного больше работы. (У меня есть видео по  отложенным и jQuery,  которое может сделать это проще для вас.)