如何在AngularJS 1控制器中注入条件服务?

How do you inject a condition service into AngularJS 1 Controller

本文关键字:注入 条件 服务 控制器 AngularJS      更新时间:2023-09-26

我有一个设计为自包含的角模块。一个消费应用程序可以添加带有url参数的指令,当它与小部件交互时,它将使用该url作为其整体数据源。它有一个通用的LoadService,使用$http来加载数据,并期望一个特定的JSON格式来运行小部件。

现在我正在尝试重构,以便有人也可以创建一个自定义加载服务并将其注入到模块中,但如果没有注入,那么它将使用默认的数据加载。所以我想弄清楚我如何创建一种方式,CustomLoadService被注入,如果它是由正在消费模块的应用程序定义的。但是,如果没有定义自定义服务,它不应该出错,它应该只使用默认服务。

我正在研究$injector.get并看到这是一种可能性,但我在将$injector注入控制器时遇到了麻烦。我以为这将是简单的$location注入。类似…

angular
  .module('Widget')
  .controller('WidgetController',[
    '$scope', 
    'WidgetLoadService', 
    '$injector', 
    WidgetController
  ]);

这个方法似乎不工作,所以我想知道…解决这个问题的最好的、最"有角度的方法"是什么?我应该如何使用$injector。

你可以使用$injector:

app.controller('MainCtrl', function($scope, $injector) {
  $scope.name = $injector.get('test').name;
}).factory('test', function() { return {name: 'world'} });

所以你可能会得到这样的结果:

app.controller('MainCtrl', function($scope, shareService) {
  $scope.name = shareService.getData();
  shareService.setDataService('dataService2');
  $scope.name = shareService.getData();
})
.factory('shareService', function($injector) { 
  var dataServiceName;
  return {
    setDataService: function(name) {
      dataServiceName = name;
    },
    getData: function(name) {
      return $injector.get(dataServiceName || 'dataService').data;
    }
  } 
})

.factory('dataService', function() { return {data: 'world'} })
.factory('dataService2', function() { return {data: 'world 2'} });