0

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

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

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

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

这种方法似乎不起作用,所以我想知道......解决这个问题的最佳最“角度方式”是什么。我应该如何使用 $injector。

4

1 回答 1

0

您可以使用 $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'} });
于 2016-08-30T17:18:51.583 回答