2013-05-02 17 views
9

Qual è la differenza tra l'attuazione di una funzione di rootScope $ e un servizio? Sicurezza saggia o rendimento saggio.

Ho letto this, quindi mi chiedo.

Ho cercato di capire se una determinata funzione globale per la mia app sarebbe stata implementata al meglio in un servizio o sul $ rootScope stesso. Per dare un'idea di ciò che sto facendo, sto attualmente sviluppando una funzione di forma sporca in cui chiede all'utente se lui/lei si allontana da una certa forma. In questo caso, ho deciso di implementarlo al meglio come una funzione globale, quindi qualche suggerimento?

Grazie per le risposte,

gen

+0

Vedere: http://stackoverflow.com/a/35411623/2893073 – Eddy

risposta

8

In questo caso vorrei andare per un servizio per evitare di avere uno stato globale. tutti i nuovi ambiti vengono creati da $ rootScope. I nuovi controller o chiunque utilizzi un ambito avranno i valori di $rootscope disponibili. Ad esempio, se si definisce $rootScope.validate() e in un controller si definisce una funzione $scope.validate() poiché si dimentica la prima definizione, qualcosa andrà certamente storto.

C'è un articolo di Misko H. su questo http://misko.hevery.com/code-reviewers-guide/flaw-brittle-global-state-singletons/

servizi sono instantianted su richiesta, mentre $ rootScope viene creato durante bootstrap, e può essere iniettato ovunque ne avete bisogno. Questo è buono per la testabilità.

Angular non crea servizi di istanza a meno che non siano richiesti direttamente o indirettamente dall'applicazione.

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

3

Come @egamonal servizi citati sono il modo più robusto per la condivisione delle funzionalità comune. Non solo i servizi sono istanziati su richiesta, sono singleton per natura quindi una volta creato un servizio, la stessa istanza viene passata da AngularJS quando richiesto. Quindi, se qualcosa può andare allo scopo di root, può anche essere implementato usando un servizio.

Una cosa da tenere a mente con un approccio globale è la possibilità di perdita di memoria. L'istanza delle classi JS o forse gli elementi DOM rimangono nella memoria perché li hai referenziati dalle tue funzioni globali (sia in $ rootscope che in servizio).

+0

Ciò che mi piace di rootScope è che non ho bisogno di fare confusione con le promesse. Se ho utente app posso tenere orlo a $ rootScope.appUser e se $ rootScope.appUser.firstName viene cambiato non ho bisogno di sottoscrivere o emettere eventi, posso solo avere Nome Firs: {{}} in appUser.firstName qualsiasi vista Mi manca qualcosa? – Toolkit

Problemi correlati