2012-05-07 9 views
156

El siguiente archivo "obras" (el sentido de que no lanza 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: Unknown provider: $rootScope from modx
Source File: http://code.angularjs.org/angular-1.0.0rc7.js
Line: 2491

WTF?

+107

+1 para WTF como la línea de fondo. –

Respuesta

296

No puede solicitar, por ejemplo, durante la fase de configuración; puede solicitar solo 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 obtener más información.

+9

Gracias, tiene mucho sentido, pero ¿cómo lo sabías? ¿Estaba en los documentos? – Malvolio

+140

@Mavolio No, él es uno de los 3 desarrolladores principales. – ChrisOdney

+8

Bueno, FWIW, ahora está en los documentos, en la sección "Módulo de carga y dependencias". –

6

que he encontrado el siguiente "patrón" a ser muy útil:

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

donde, MainCtrl es un controlador. No me siento cómodo confiando en los nombres de los parámetros de la función del Controlador haciendo una imitación uno a uno de las instancias por temor a que cambie los nombres y arruine las cosas. Prefiero usar explícitamente $ inject para este propósito.

+0

Eso está bien, pero ¿cómo accedes a 'MainCtrl' de esa manera? – f1lt3r

+0

Sé que tu comentario es antiguo, pero vale la pena responder preguntas en el futuro. Los módulos/controladores se pueden definir así para que pueda acceder a ellos de esta manera: 'angular.module ('myMod', []).controlador ('theController', controllerFunction); controllerFunction. $ Inject = []; función controllerFunction() { } ' – Mutmatt

0

I no sugiera que use la sintaxis como lo hizo. AngularJS le permite tener diferentes funcionalidades como desee (run, config, service, factory, etc ..), que son más professional.In esta función ni siquiera tiene que inyectar por sí mismo como

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

puede usarlo, como usted sabe.

Cuestiones relacionadas