将参数从控制器传递到angularjs中的服务

时间:2015-06-17 13:53:12

标签: angularjs ionic

如何让一个服务或工厂从多个控制器接收两个参数?

url的一个参数,另一个用于存储在文件系统上的文件名。

我将有许多控制器使用此服务,每个控制器都传递自己的url和文件名,读取url并生成pdf。

我将始终存储最后下载的pdf,提供“打开最后一个pdf”按钮,该按钮将使用name参数。

我将从网址获得一个“生成新的pdf”按钮。

我遵循本教程https://blog.nraboy.com/2014/09/manage-files-in-android-and-ios-using-ionicframework/,一切正常。

我正在使用cordova文件传输和inappbrowser cordova插件

这些部分将收到参数:

dirEntry.getFile(“pdf-number-1.pdf”,

ft.download(是encodeURI( “http://www.someservice.com”)中,p,

我的尝试总是触发消息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');
}

1 个答案:

答案 0 :(得分: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将其添加为依赖项(如果您使用的是像browserify那样)或也许如果你正在缩小你的代码,因为你没有使用minsafe语法