如何将条件服务注入 AngularJS 1 Controller

How do you inject a condition service into AngularJS 1 Controller

我有一个 angular 模块,它被设计成独立的。消费应用程序可以添加带有 url 参数的指令,并且在与小部件交互时它将使用 url 作为整体数据源。这有一个通用的 LoadService,它使用 $http 加载数据,并期望一个特定的 JSON 格式到 运行 小部件。

好吧,现在我正在尝试重构,以便有人也可以创建自定义加载服务并将其注入到模块中,但如果未注入,它将使用默认数据加载。因此,我试图弄清楚如何创建一种方式来注入 CustomLoadService(如果它是由使用该模块的应用程序定义的)。但是,如果未定义自定义服务,它不应该出错,它应该只使用默认服务。

我正在研究 $injector.get 并认为这是一种可能性,但我无法将 $injector 注入控制器。我以为注入 $location 一样简单。像...

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

这种方法似乎行不通,所以我想知道...解决此问题的最佳方法是什么 "angular way"。我应该如何使用 $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'} });