Inyectando un servicio en otro servicio en angularJS

Respuestas:

118

Si. siga la regla de inyección regular en angularjs.

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

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

Gracias a @simon. Es mejor usar la inyección Array para evitar problemas de minificación.

  app.service('service2',['service1', function(service1) {}]);
Alborz
fuente
20
Sugiero usar la forma de inyección de matriz para evitar problemas cuando desee minimizar sus scripts en el futuro:['service1', function(service1) {}]
Simon Belanger
2
También puede utilizar una ngmintarea gruñida asociada.
John Ledbetter
si quisiera acceder a otro método desde el mismo servicio, supongo que no querría inyectar el mismo servicio en el servicio; Sin embargo, intentar llamarlo usando 'esto' no parece funcionar para mí, ¿alguna idea sobre cuál es la mejor manera de hacerlo? ¡Gracias!
timhc22
Me pregunto qué pasa si inyecta 'service1' en 'service2', y también inyecta 'service2' en 'service1', ¿qué pasará entonces? ¿Qué pasa si la inicialización de un servicio depende de la inicialización del otro servicio?
Xinan
@Xinan en ese caso, angularjs arrojará un error de dependencia cíclica. Así que evítelo y de todos modos esa no es una buena práctica de programación.
jitenagarwal19
8

Si. Así (este es un proveedor, pero se aplica lo mismo)

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


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

En este ejemplo, $dbes un servicio declarado en otra parte de la aplicación e inyectado en la $getfunción del proveedor .

Precio de Pauli
fuente
5

Para evitar cualquier confusión, creo que también vale la pena mencionar que si está utilizando cualquier otro servicio (por ejemplo, $ http, $ cookies, $ state) en su childService, entonces también debe declararlos explícitamente.

p.ej

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]);

}());

Puede declarar los servicios que está utilizando dentro de su hijo en una matriz y luego se inyectan automáticamente, o inyectarlos por separado con la anotación $ inject:

childService.$inject = ["$http", "$cookies", "parentService"]; 
angular.module("app").service("childService ", childService );
Tiberiu Oprea
fuente