如何使用$ inject.get注入多个角度服务

时间:2014-09-08 03:46:27

标签: angularjs angularjs-service

我在使用角度js中的$ inject.get时遇到问题。

假设我有像这样的角色服务

app.service("serviceOne", function() { 
 this.dialogAlert = function() {
  return 'Message One'
 };
});

app.service("serviceTwo", function() { 
 this.dialogAlert = function() {
  return 'Message Two'
 };
});

app.service("serviceThree", function() { 
 this.dialogAlert = function() {
  return 'Message Three'
 };
});

使用工厂动态调用dialogAlert()

app.factory("alertService", function($window, $injector) {
 if ($window.servicesOne) {
   return $injector.get("serviceOne");
 } else {
   return $injector.get(["serviceTwo", "serviceThree"]);
 }
});

使用这种代码,它给了我“未知提供者”。 或者有没有替代解决方案? 谢谢你们。

1 个答案:

答案 0 :(得分:2)

injector.get只接受一个服务名称作为参数,不支持数组,您可能希望通过执行return ["serviceTwo", "serviceThree"].map($injector.get)来返回服务实例数组: -

app.factory("alertService", function($window, $injector) {
  var service = ["serviceOne"];
  if (!$window.servicesOne) {
   service = ["serviceTwo", "serviceThree"]; 
  }
  return service.map($injector.get); //To be consistent send back this as well as array
});

因此,当您注入alertService时,它将返回一系列依赖性。

app.controller('MainCtrl', function($scope, alertService) {
 //  alertService will be array of dependecies.
  console.log(alertService.map(function(itm){return itm.dialogAlert()}));
});

<强> Demo

或带地图返回: -

 app.factory("alertService", function($window, $injector) {
      var service = ["serviceOne"], 
          serviceObjs = {};

      if (!$window.servicesOne) {
       service = ["serviceTwo", "serviceThree"]; 
      }

      angular.forEach(service, function(itm){
        serviceObjs[itm] = $injector.get(itm);
       });

     return serviceObjs;
    });