Injizieren eines Dienstes in einen anderen Dienst in angleJS

82

Ist es möglich, einen Dienst in angleJS in einen anderen Dienst einzufügen?

Le Garden Fox
quelle

Antworten:

117

Ja. Befolgen Sie die reguläre Injektionsregel in Angularjs.

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

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

Danke an @simon. Es ist besser, die Array-Injektion zu verwenden, um Probleme zu minimieren.

  app.service('service2',['service1', function(service1) {}]);
Alborz
quelle
20
Ich schlage vor, die Array-Injection-Methode zu verwenden, um Probleme zu vermeiden, wenn Sie Ihre Skripte in Zukunft minimieren möchten:['service1', function(service1) {}]
Simon Belanger
2
Sie können auch eine ngminzugehörige Grunzaufgabe verwenden.
John Ledbetter
Wenn Sie über denselben Dienst auf eine andere Methode zugreifen möchten, möchten Sie vermutlich nicht denselben Dienst in den Dienst einfügen. Der Versuch, es mit "dies" zu nennen, scheint für mich jedoch nicht zu funktionieren. Irgendwelche Gedanken darüber, wie man es am besten macht? Vielen Dank!
Timhc22
Ich frage mich nur, was passiert, wenn Sie 'service1' in 'service2' und 'service2' in 'service1' einfügen? Was passiert dann? Was ist, wenn die Initialisierung eines Dienstes von der Initialisierung des anderen Dienstes abhängt?
Xinan
@Xinan in diesem Fall wird anglejs einen Fehler der zyklischen Abhängigkeit auslösen. Vermeiden Sie es also und das ist sowieso keine gute Programmierpraxis.
Jitenagarwal19
8

Ja. So (dies ist ein Anbieter, aber das Gleiche gilt)

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


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

In diesem Beispiel $dbwird ein Dienst an einer anderen Stelle in der App deklariert und in die $getFunktion des Anbieters eingefügt.

Pauli Price
quelle
5

Um Verwirrung zu vermeiden, ist es meines Erachtens auch erwähnenswert, dass Sie, wenn Sie andere Dienste (z. B. $ http, $ cookies, $ state) in Ihrem childService verwenden, diese auch explizit deklarieren müssen.

z.B

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

}());

Sie können die Dienste, die Sie in Ihrem Kind verwenden, entweder in einem Array deklarieren und sie werden dann automatisch injiziert, oder Sie können sie separat mit der Annotation $ inj injizieren:

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