2015-06-17 2 views
0

Как я могу получить один сервис или фабрику, получая два параметра от многих контроллеров?Передача параметра от контроллера к службам в angularjs

Один параметр для URL-адреса, другой для имени файла, который будет храниться в файловой системе.

У меня будет много контроллеров, использующих эту услугу, каждый из которых передает свой собственный URL-адрес и имена файлов, которые читают URL-адрес и генерируют pdf-файл.

Я всегда буду хранить последний загруженный pdf, содержащий кнопку «открыть последний pdf», которая будет использовать параметр имени.

У меня будет кнопка «Создать новый pdf», исходящий от URL-адреса.

Я следую этому руководству https://blog.nraboy.com/2014/09/manage-files-in-android-and-ios-using-ionicframework/ и все работает нормально.

Я использую Cordova передачи файлов и inappbrowser Cordova плагины


Эти секции будут получать параметры:

dirEntry.getFile ("PDF-номер-1.pdf",

ft.download (encodeURI ("http://www.someservice.com"), р,


Моя попытка всегда вызывает сообщение unknow pdfService provider

Какие понятия углового я не хватает? Как я могу это исправить?

В services.js я есть:


.service('pdfService', function($scope, $ionicLoading){ 

if(window.cordova && window.cordova.InAppBrowser){ 
    window.open = window.cordova.InAppBrowser.open; 
    console.log("InAppBrowser available"); 
    } else { 
    console.log("InAppBrowser not available"); 
    } 

    this.download = function() { 
    $ionicLoading.show({ 
     template: 'Loading...' 
    }); 
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fs) { 
     fs.root.getDirectory("ExampleProject",{create: true}, 
      function(dirEntry) { 
       dirEntry.getFile(
        "pdf-number-1.pdf", 
        { 
         create: true, 
         exclusive: false 
        }, 
        function gotFileEntry(fe) { 
         var p = fe.toURL(); 
         fe.remove(); 
         ft = new FileTransfer(); 
         ft.download(
          encodeURI("http://www.someservice.com"), 
          p, 
          function(entry) { 
           $ionicLoading.hide(); 
           $scope.imgFile = entry.toURL(); 
          }, 
          function(error) { 
           $ionicLoading.hide(); 
           alert("Download Error Source -> " + error.source); 
          }, 
          false, 
          null 
         );       
        }, 
        function() { 
         $ionicLoading.hide(); 
         console.log("Get file failed"); 
        } 
       ); 
      } 
     ); 
    }, 
    function() { 
     $ionicLoading.hide(); 
     console.log("Request for filesystem failed"); 
    }); 
    } 

    this.load = function() { 
     $ionicLoading.show({ 
     template: 'Loading...' 
     }); 

     window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fs) { 
      fs.root.getDirectory(
       "ExampleProject", 
       { 
        create: false 
       }, 
       function(dirEntry) { 
        dirEntry.getFile(
         "pdf-number-1.pdf", 
         { 
          create: false, 
          exclusive: false 
         }, 
         function gotFileEntry(fe) { 
          $ionicLoading.hide(); 
          $scope.imgFile = fe.toURL(); 
          alert(fe.toURL()); 
          window.open(fe.toURL(), '_system', 'location=no,toolbar=yes,closebuttoncaption=Close PDF,enableViewportScale=yes'); 
         }, 
         function(error) { 
          $ionicLoading.hide(); 
          console.log("Error getting file"); 
         } 
       ); 
       } 
     ); 
     }, 
     function() { 
      $ionicLoading.hide(); 
      console.log("Error requesting filesystem"); 
     }); 
    } 
}); 

И в контроллере:

.controller('SomeCtrl', function($scope, $ionicPopup, pdfService) { 

... 

pdfService.download = function(url) { 
    console.log('pdfService download'); 
} 
pdfService.load = function() { 
    console.log('pdfService load'); 
} 

ответ

2

Вам нужно будет вводить услугу контроллерах и вызвать функцию с двумя параметрами, которые вы хотите в качестве аргументов. например.

.service('pdfService', function(){ 
    var lastUrl; 
    var lastFileName 
    return { 
     createPdf(url, fileName){ 
      //do processing 
      lastUrl = url; 
      lastFileName = fileName 
     }, 
     loadLastPdf(){ 
     //use lastUrl and lastFileName 
     } 
    } 
} 

и в контроллере:

.controller('SomeCtrl', function(pdfService) { 
    pdfService.createPdf('http://example.com', 'file.pdf'); 
    // or pdfService.loadLastPdf(); 
} 

Это, как говорится, ошибка вы сообщаете означает, что DI не может найти службу с именем pdfService, чтобы ввести в контроллер. Возможно, это связано с тем, что вы забыли включить файл service.js в свой html в качестве тега скрипта (если вы это делаете), или вы забыли добавить его в качестве зависимости, используя require (если вы используете sth, например, для браузера) или возможно, если вы уменьшаете свой код, так как вы не используете синтаксис minsafe

+0

Thank's mxa055! теперь ясно, я пытаюсь реализовать, но вижу простую ошибку sintax: Неожиданный токен. at line: this.downloadPdf = function (url, fileName) {код находится здесь: http://plnkr.co/edit/ASB7LSCuCRvVLGI3Kqxf в случае, если вы хотите дать указание указать синтаксическую ошибку. Лучшие советы. –

+0

Да, я включаю службы js как 'code' ' code'. Я не уверен в том, как зарегистрировать сервис im my controller у меня есть: 'code'.контроллер ('SomeCtrl', ['$ scope', 'pdfService', функция ($ scope, $ ionicPopup, pdfService) { ... }]) 'code' –

+1

Вы не можете вводить $ scope в свою службу, так как там нет представления, чтобы приклеить его. Также в декларации вашего контроллера вы не указали декларацию minsafe для $ ionicPopup в своем комментарии выше. Проверьте это, возможно, помогает http://plnkr.co/edit/S52j3LXvljWS2GJU7P1v?p=preview – masimplo

Смежные вопросы