Внедрение сервиса в другой сервис в angularJS

Ответы:

118

Да. следуйте обычному правилу инъекции в angularjs.

app.service('service1', function(){});

//Inject service1 into service2
app.service('service2',function(service1){});

Спасибо @simon. Лучше использовать внедрение массива, чтобы избежать проблемы с минимизацией.

  app.service('service2',['service1', function(service1) {}]);
Альборз
источник
20
Я предлагаю использовать способ внедрения массива, чтобы избежать проблем, когда вы захотите минимизировать свои скрипты в будущем:['service1', function(service1) {}]
Саймон Белэнджер,
2
Вы также можете использовать ngminили связанную задачу ворчания.
Джон Ледбеттер
если вы хотите получить доступ к другому методу из той же службы, я полагаю, вы не захотите внедрять ту же службу в службу; попытка назвать это с помощью 'this', похоже, не работает для меня, есть мысли о том, как лучше всего это сделать? благодаря!
timhc22
Просто интересно, что, если вы введете «service1» в «service2», а также «service2» в «service1», что тогда произойдет? Что делать, если инициализация одной службы зависит от инициализации другой службы?
Xinan
@Xinan в этом случае angularjs выдаст ошибку циклической зависимости. Так что избегайте этого, и в любом случае это не очень хорошая практика программирования.
jitenagarwal19,
8

Да. Вот так (это провайдер, но применимо то же самое)

    module.provider('SomeService', function () {


    this.$get = ['$q','$db','$rootScope', '$timeout', 
                function($q,$db,$rootScope, $timeout) {
          return reval;
    }
    });

В этом примере $dbэто служба, объявленная где-то в приложении и внедренная в $getфункцию поставщика .

Паули Прайс
источник
5

Чтобы избежать путаницы, я думаю, также стоит упомянуть, что если вы используете какие-либо другие службы (например, $ http, $ cookies, $ state) в своем childService, вам также необходимо явно объявить их.

например

function() {
  var childService = function($http, $cookies, parentService) {

  // Methods inherited
  this.method1Inherited = parentService.method1();
  this.method2Inherited = parentService.method2();

  // You can always add more functionality to your child service

  angular.module("app").service("childService", ["$http", "$cookies", "parentService", childService]);

}());

Вы можете либо объявить службы, которые вы используете, внутри своего дочернего элемента в массиве, и затем они будут автоматически вводиться, либо вводить их отдельно с помощью аннотации $ inject:

childService.$inject = ["$http", "$cookies", "parentService"]; 
angular.module("app").service("childService ", childService );
Тибериу Опря
источник