您能否将 Angular 服务作为参数传递给另一个 Angular 服务提供的函数?

Can you pass an Angular service as a parameter to a function provided by another Angular service?

我的 Angular 应用程序中有很多功能,大部分使用相同的代码。所以我决定创建一个由经常重复的代码组成的服务,并将差异作为参数。

每个重复功能的主要区别之一是它们使用不同的服务。

例如,在一个简化的摘录中,有:

$scope.signin = function(email, password){
        loginSrvc(email, password).execute()
            .success(function(data, status, headers, config){
                if (status == 200){
                .... 

其中一个

  $scope.logout = function(){
        $scope.loading = true;
        signoutSrvc().execute()
            .success(function(data, status, headers, config){
                if (status == 200){
                ....

但本质上它们是一样的。

我希望能够将每个函数正在使用的服务(例如 loginSrvcsignoutSrvc 等)传递给处理所有此类代码的外部服务。

但是,当我将服务传递给我的新服务时,它在另一端显示为undefined

我的新服务如下所示:

sharedFunctionsApp.factory('serverCommunicationFactory', [function(){
    console.log("serverCommunicationFactory");
    return function(service){
        console.log(service);
        service.execute();
    }
}]);

然后我将服务从其他模块传递给它(当然是在注入 ShareFunctions 模块之后),如下所示:

serverCommunicationFactory()(loginSrvc);

但它仍然显示为 undefined

如何将我的服务传递给这个新的共享服务?

当然你可以在一个服务中注入其他服务,就像这样:

sharedFunctionsApp.factory('yourServiceName', ['theServiceToInject', function(theServiceToInject){
  return {
      yourServiceMethode: function() {
          console.log(theServiceToInject);
          return;
      }
  }
}]);

编辑:

您还可以使用注入器来注入您的服务:docs 然后动态注入服务,执行如下操作:

var myService = $injector.get('MyServiceName');

是的,您当然可以将一项服务注入另一项服务。

HTML

<div ng-app="myApp"  ng-controller="startCtrl">

</div>

.js

var app=angular.module("myApp",[]);

app.factory("firstService",function(){
      return{
        myFunction:function()
        {
            var myVar="Hello from service one";
            return myVar;
        }
    }

});



app.factory("secondService",function(firstService){
      return{
        callToFirstService:function()
        {
            var result=firstService.myFunction();
            return result;
        }
    }

});

app.controller("startCtrl",function($scope,secondService){
     var finalResult= secondService.callToFirstService();
    console.log(finalResult);
});

你可以在工作中查看这个 fiddle.....

https://jsfiddle.net/codu16t5/

这是一个小演示。