你可以将Angular服务作为参数传递给另一个Angular服务提供的函数吗?

时间:2015-03-10 08:25:24

标签: javascript angularjs refactoring angular-services

我的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

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

2 个答案:

答案 0 :(得分:1)

当然,您可以在服务中注入其他服务,就像它一样:

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

编辑:

您也可以使用注射器注入您的服务:docs 然后动态注入服务,例如:

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

答案 1 :(得分:0)

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

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);
});

你可以用工作小提琴来检查......

https://jsfiddle.net/codu16t5/

这是一个小型演示。