2016-10-26 5 views
9

Ich arbeite mit AngularJS 1.x und ich kann den gleichen Dienst mehrmals im selben Modul definieren. Im folgenden Code-Snippet, ich bin die Definition des Service nameService 2 mal in Modul myApp:Deklarieren AngularJS-Service mehrmals im selben Modul

(function() { 
    'use strict'; 

    angular 
    .module('myApp', []) 
    .controller('MainController', MainController) 
    .factory('nameService', nameService1) 
    .factory('nameService', nameService2); 

    MainController.$inject = ['nameService']; 

    function MainController(nameService) { 
    var vm = this; 

    vm.message = nameService.getName(); 
    } 

    function nameService1() { 
    return { 
     getName: getName 
    }; 

    function getName() { 
     return 'First Definition'; 
    } 
    } 

    function nameService2() { 
    return { 
     getName: getName 
    }; 

    function getName() { 
     return 'Second Definition'; 
    } 
    } 
})(); 

Zur Laufzeit wird verwenden AngularJS den Wert durch die zweite Implementierung des Dienstes zurückgegeben: "Second Definition". Bitte überprüfen Sie die this Plunker example.

also empirisch scheint AngularJS immer die neueste Definition eines Service zu nutzen, um die vorherigen zu ignorieren.

Meine Frage ist: Gibt es eine offizielle Dokumentation dieses Verhalten beschreiben?

+3

Javascript wird sequentiell kompiliert. Wenn es den 2. nameService findet, überschreibt es den vorherigen – aliasav

+0

Nun, JavaScript kann sequentiell kompilieren, aber es ist das Angular Framework, das entscheidet, wenn eine zweite Definition eines bereits definierten Dienstes gefunden wird. Es könnte zum Beispiel beschließen, immer die erste Instanz zu behalten und die anderen zu verwerfen, im Gegenteil, es scheint immer die letzte zu behalten. Meine Frage ist: Gibt es offizielle Dokumentation über dieses Verhalten? – Andrea

Antwort

1

Hier überschreiben Sie die Definition von Factory/Service. Factory/Service ist Singleton, d. h. es wird nur eine Instanz davon geben.

factory('name', constructing_function) 

Ihr Fall

factory('nameService', nameService1)//Here object { getName: getName } will be assigned to nameService instance. 

factory('nameService', nameService2)//Here object { getName: getName } (#2nd definition) will be assigned to nameService instance. i.e. nameservice instance referring to (#2nd definition). 
+0

Vielen Dank für Ihre Antwort. Ich weiß, dass Service Singleton in AngularJS ist, aber ich muss wissen, ob es offizielle Angular Dokumentation gibt, die sagt: "Angular immer die neueste Definition nehmen, die vorherigen ignorierend".Weißt du, ob es im Doc diese Art von Satz gibt? – Andrea

+0

Denke nicht. Aber ich habe erklärt, was eigentlich hinter der Seance passiert. – ram1993

+0

Ja, danke Ram1993. Aber technisch kenne ich es, aber ich brauche eine Art "offizielle Referenz" (in der Dokumentation, How-tos, usw.) dieses Verhaltens. – Andrea

1

Das ist die Art und Weise ist, wie JavaScript funktioniert:

function Vinoth(){console.log("Printing first")} 

function Something(){console.log("Printing Something")} 

function Vinoth(){console.log("Printing Second")} 

Wenn Sie eine console.log(Vinoth()); tun, es ist die Second man immer drucken. Über zu Ihrem zweiten Teil:

angular 
    .module('myApp', []) 
    .controller('MainController', MainController) 
    .factory('nameService', nameService1) 
    .factory('nameService', nameService2); 

AngularJS Dienstleistungen sind singleton von Natur aus, so dass sie eine Instanz in Ihrem Anwendungslebenszyklus sein wird. Ihre nameService1 and nameService2 zeigen auf dieselbe nameServiceinstance. Technisch ist es nameService hält nameService2 wie es nach dem Heben vorausgeht.

+0

Nun, wie ich im obigen Kommentar zu "aliasav" erklärte: das Angular Framework, das entscheidet, was zu tun ist, wenn es eine zweite Definition eines bereits definierten Dienstes findet. Es könnte zum Beispiel beschließen, immer die erste Instanz zu behalten und die anderen zu verwerfen, im Gegenteil, es scheint immer die letzte zu behalten. Meine Frage ist: Gibt es eine offizielle Dokumentation über dieses Verhalten? – Andrea

+0

@Andrea: Cool, schau in die JavaScript-Hoisting .... Das ist das Verhalten Angularjs folgt auch ... – Thalaivar

+0

danke für den Rat, aber ich verstehe nicht, warum Sie denken, ist eine Metter von Hoisting hier. In meinem Codeschnipsel haben die beiden Funktionen unterschiedliche Namen ('nameService1' und' nameService2'). Nur die Zeichenfolge identifiziert den Dienstnamen in 'factory()' Methode ist gleich ('" nameService "'). – Andrea

0

Nein, es gibt keine offizielle Dokumentation für diese Funktion.

Wenn Sie möchten, dass Sie dort sind, können Sie die Betreuer von angularjs bitten, eine Dokumentation für diese Funktion hinzuzufügen.

0

Sie müssen den Dienst (Inject) nicht zweimal definieren. Bessere Lösung ist, Sie definieren den Service einmal. Und verwenden wie,

angular.module('myApp', []).controller('MainController', MainController) .factory('nameService', nameService1) 

Innerhalb dieser können wir diesen Dienst nutzen wie,

var nameService2 = angular.copy(nameService); 

Das für die beste Praxis ist.

Verwandte Themen