Как внедрить службу условий в контроллер AngularJS 1

У меня есть угловой модуль, который предназначен для автономной работы. Что приложение-потребитель может добавить директивы с параметром URL-адреса и будет использовать этот URL-адрес в качестве общего источника данных при взаимодействии с виджетом. У этого есть общий LoadService, который использует $http для загрузки данных и ожидает, что определенный формат JSON запустит виджет.

Ну, прямо сейчас я пытаюсь провести рефакторинг, чтобы кто-то также мог создать собственный сервис загрузки и внедрить его в модуль, но если он не внедрен, он будет использовать загрузку данных по умолчанию. Итак, я пытаюсь понять, как я могу создать способ внедрения CustomLoadService, если он определен приложением, которое использует модуль. Однако он не должен выдавать ошибку, если пользовательская служба не определена, она должна просто использовать службу по умолчанию.

Я изучал $injector.get и видел в этом возможность, но у меня возникли проблемы с внедрением $injector в контроллер. Я думал, что это будет так же просто, как $location ввести. Что-то типа...

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

Этот метод, похоже, не работает, поэтому мне интересно... Каков наилучший самый "угловой способ" решения этой проблемы. Как мне использовать $injector.


person Scott Bonner    schedule 30.08.2016    source источник


Ответы (1)


Вы можете использовать $инжектор:

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'} });
person Petr Averyanov    schedule 30.08.2016
comment
Посмотрите на код, который я предоставил, что я делаю неправильно, что мешает ему работать? Я получаю $injector не определен - person Scott Bonner; 30.08.2016
comment
Может быть, я упускаю различия, но похоже, что ваш пример не должен отличаться от предоставленного мной кода, но мой не работает, что мне не хватает? - person Scott Bonner; 30.08.2016
comment
На самом деле вы не предоставили никакого кода... Создайте минимальный планк с вашим кодом. - person Petr Averyanov; 31.08.2016
comment
Я нашел проблему, не имеющую ничего общего с внедрением службы, она работала нормально. У меня была функция инициализации в суперклассе, в которой я забыл изменить имя параметра с $location на $injector, поэтому я получал неопределенное значение, потому что $injector не существовало в этой функции. - person Scott Bonner; 31.08.2016