Impossibile accedere a $ rootScope


162

Il seguente file "funziona" (nel senso che non genera errori):

<!doctype html>
<html ng-app="modx">
    <script src="http://code.angularjs.org/angular-1.0.0rc7.js"></script> 
    <script>
        angular.module("modx", [], function($routeProvider) {
        });
    </script>
</html>

ma questo

<!doctype html>
<html ng-app="modx">
    <script src="http://code.angularjs.org/angular-1.0.0rc7.js"></script>
    <script>
        angular.module("modx", [], function($routeProvider, $rootScope) {
        });
    </script>
</html>

dà l'errore:

Errore: provider sconosciuto: $ rootScope dal
file sorgente modx : http://code.angularjs.org/angular-1.0.0rc7.js
Linea: 2491

WTF?


114
+1 per WTF come linea di fondo.
Eliran Malka,

Risposte:


307

Non è possibile chiedere ad esempio durante la fase di configurazione: è possibile richiedere solo i provider.

var app = angular.module('modx', []);

// configure stuff
app.config(function($routeProvider, $locationProvider) {
  // you can inject any provider here
});

// run blocks
app.run(function($rootScope) {
  // you can inject any instance here
});

Vedere http://docs.angularjs.org/guide/module per maggiori informazioni.


9
Grazie, ha perfettamente senso, ma come lo sapevi? Era nei documenti?
Malvolio,

143
@Mavolio No, è uno dei 3 sviluppatori principali.
ChrisOdney,

8
Bene, FWIW, è ora nei documenti, nella sezione "Caricamento e dipendenze del modulo".
Mark Rajcok,

1
@vojta Ma cosa succede se devo passare i parametri dall'esterno e utilizzarli config? dire il percorso di root nell'app asp.net? Semplicemente non voglio usare variabili globali e volevo usare ng-init='root:<%= myroot %>'e usare rootvalore in module.config.
vittore,

7
@vittore Penso che mettere questa configurazione "esterna" nella finestra globale vada bene. Oppure hai un modulo che definisce tutto questo e poi lo carichi nella tua app - ad es. angular.module('config', []).constant('appRoot', '/local/js/app');(questo codice verrebbe generato dal tuo server (potresti persino generarlo come file JS, piuttosto che inserirlo nel file html). Quindi, la tua app carica questo modulo e quindi ha accesso a appRoot.
Vojta

7

Ho trovato molto utile il seguente "modello":

MainCtrl.$inject = ['$scope', '$rootScope', '$location', 'socket', ...];
function MainCtrl (scope, rootscope, location, thesocket, ...) {

dove, MainCtrl è un controller. Mi sento a disagio a fare affidamento sui nomi dei parametri della funzione Controller facendo un imitazione uno-a-uno delle istanze per paura che potrei cambiare nome e confondere le cose. Preferisco di gran lunga usare esplicitamente $ inject per questo scopo.


È pulito; ma come si accede in MainCtrlquel modo?
f1lt3r,

So che il tuo commento è vecchio ma vale la pena rispondere alle domande per il futuro. Moduli / controller possono essere definiti in questo modo in modo da poterli accedere in questo modo:angular.module('myMod', []).controller('theController', controllerFunction); controllerFunction.$inject = []; function controllerFunction() { }
Mutmatt

1

Io non suggerisco di utilizzare la sintassi come avete fatto. AngularJs ti consente di avere diverse funzionalità come desideri ( run,config , service, factory, ecc ..), che sono più professional.In questa funzione non hanno nemmeno bisogno di iniettare che da soli come

MainCtrl.$inject = ['$scope', '$rootScope', '$location', 'socket', ...];

puoi usarlo, come sai.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.