2013-05-02 17 views
9

Was ist der Unterschied zwischen der Implementierung einer $ rootScope-Funktion und eines Service? Sicherheit oder Leistung.

Ich habe this gelesen, also frage ich mich.

Ich habe versucht herauszufinden, ob eine bestimmte globale Funktion für meine App am besten in einem Dienst oder auf dem $ rootScope selbst implementiert werden würde. Um euch mit einer Idee von dem zu konfrontieren, was ich mache, entwickle ich gerade eine "dreckige Form" -Funktion, in der der Benutzer gefragt wird, ob er von einer bestimmten Form weg navigiert. In diesem Fall habe ich beschlossen, es am besten als globale Funktion zu implementieren, also irgendwelche Hinweise?

Danke für die Antworten,

Jan

+0

Siehe: http://Stackoverflow.com/a/35411623/2893073 – Eddy

Antwort

8

In diesem Fall habe ich für einen Dienst gehen würde einen globalen Zustand vermeiden müssen. Alle neuen Bereiche werden aus $ rootScope erstellt. Neue Controller oder Benutzer, die einen Bereich verwenden, haben Werte von $rootscope zur Verfügung. Zum Beispiel, wenn Sie $rootScope.validate() definieren und in einer Steuerung definieren Sie eine Funktion $scope.validate(), weil Sie über die erste Definition vergessen, etwas wird sicherlich schief gehen.

Es ist ein Artikel von Misko H. zu dieser http://misko.hevery.com/code-reviewers-guide/flaw-brittle-global-state-singletons/

Dienstleistungen sind auf Anfrage instantianted, während $ rootScope während Bootstrap erstellt wird, und kann injiziert werden, wo man sie braucht. Dies ist gut für die Testbarkeit.

Angular instanziiert Dienste nicht, es sei denn, sie werden direkt oder indirekt von der Anwendung angefordert.

(http://docs.angularjs.org/guide/dev_guide.services.creating_services)

3

Wie @egamonal erwähnten Dienstleistungen sind robuste Weise gemeinsame Funktionalität zu teilen. Nicht nur Dienste werden bei Bedarf instanziiert, sondern sind von Natur aus Singleton. Sobald ein Dienst erstellt wird, wird dieselbe Instanz von AngularJS bei Bedarf weitergeleitet. Wenn also etwas auf den root-Bereich zugreifen kann, kann es auch mithilfe eines Dienstes implementiert werden.

Denken Sie daran, mit einem solchen globalen Ansatz zu beachten, ist die Möglichkeit auf Speicherverlust. Die Instanz von JS-Klassen oder vielleicht DOM-Elementen bleiben im Speicher, weil Sie sie von Ihren globalen Funktionen aus referenziert haben (entweder in $ rootscope oder service).

+0

Was ich an RootScope mag, dass ich nicht mit Versprechungen durcheinander bringen muss. Wenn ich einen App-Benutzer habe, kann ich den Saum in $ rootScope.appUser halten und wenn $ rootScope.appUser.firstName geändert wird, muss ich keine Ereignisse abonnieren oder ausgeben, ich kann einfach den Firs-Namen: {{appUser.firstName}} haben jede Ansicht. Vermisse ich etwas? – Toolkit