No se puede llegar a $ rootScope

162

El siguiente archivo "funciona" (la sensación de que no arroja ningún error):

<!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>

pero esto

<!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>

da el error:

Error: proveedor desconocido: $ rootScope del archivo
fuente modx : http://code.angularjs.org/angular-1.0.0rc7.js
Línea: 2491

WTF?

Malvolio
fuente
114
+1 para WTF como resultado final.
Eliran Malka

Respuestas:

307

No puede solicitar, por ejemplo, durante la fase de configuración; solo puede solicitar proveedores.

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

Ver http://docs.angularjs.org/guide/module para más información.

Vojta
fuente
9
Gracias, tiene mucho sentido, pero ¿cómo lo sabías? ¿Estaba en los documentos?
Malvolio
143
@Mavolio No, él es uno de los 3 desarrolladores principales.
ChrisOdney
8
Bueno, FWIW, está en los documentos ahora, en la sección "Carga y dependencias del módulo".
Mark Rajcok
1
@vojta Pero, ¿qué pasa si necesito pasar parámetros desde afuera y usarlos config? decir ruta raíz dentro de la aplicación asp.net? Simplemente no quiero usar variables globales y quería usar ng-init='root:<%= myroot %>'y usar rootvalor en module.config.
vittore
77
@vittore creo, poner esta configuración "exterior" en la ventana global está bien. O tener un módulo que define todo esto y luego lo carga en su aplicación, por ejemplo. angular.module('config', []).constant('appRoot', '/local/js/app');(este código sería generado por su servidor (incluso podría generarlo como un archivo JS, en lugar de incluirlo en el archivo html). Luego, su aplicación carga este módulo y, por lo tanto, tiene acceso a appRoot.
Vojta
7

He encontrado que el siguiente "patrón" es muy útil:

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

donde, MainCtrl es un controlador. Me incomoda confiar en que los nombres de los parámetros de la función Controlador hacen una imitación uno por uno de las instancias por temor a que pueda cambiar los nombres y arruinar las cosas. Prefiero usar explícitamente $ inject para este propósito.

Ram Rajamony
fuente
Está muy bien; pero ¿cómo accedes MainCtrlasí?
f1lt3r
Sé que su comentario es antiguo, pero vale la pena responder a preguntas por el bien del futuro. Los módulos / controladores se pueden definir de esta manera para que pueda acceder a ellos de esta manera:angular.module('myMod', []).controller('theController', controllerFunction); controllerFunction.$inject = []; function controllerFunction() { }
Mutmatt
1

No te sugiero que uses la sintaxis como lo hiciste. AngularJS le permite tener diferentes funcionalidades como desee ( run, config, service, factory, etc ..), que son más professional.In esta función ni siquiera tienen que inyectarse por sí mismo como

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

puedes usarlo, como sabes.

Hazarapet Tunanyan
fuente