Não é possível acessar o $ rootScope

162

O seguinte arquivo "funciona" (a sensação de que não gera nenhum erro):

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

mas isso

<!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á o erro:

Erro: Fornecedor desconhecido: $ rootScope do modx
Arquivo de origem: http://code.angularjs.org/angular-1.0.0rc7.js
Linha: 2491

WTF?

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

Respostas:

307

Você não pode solicitar, por exemplo, durante a fase de configuração - você pode solicitar apenas fornecedores.

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

Veja http://docs.angularjs.org/guide/module para mais informações.

Vojta
fonte
9
Obrigado, faz todo o sentido, mas como você sabia disso? Foi nos documentos?
Malvolio
143
@Mavolio Não, ele é um dos três principais desenvolvedores.
22412 ChrisOdney
8
Bem, FWIW, está nos documentos agora, na seção "Carregamento de módulo e dependências".
precisa saber é o seguinte
1
@ vojta Mas e se eu precisar passar o parâmetro de fora e usá-lo config? dizer caminho raiz dentro do aplicativo asp.net? Eu só não quero usar variáveis ​​globais e queria usar ng-init='root:<%= myroot %>'e usar rootvalor module.config.
Vittore 26/05
7
@ Vittore eu acho, colocar esta configuração "fora" na janela global é bom. Ou ter um módulo que define tudo isso e você o carrega no seu aplicativo - por exemplo. angular.module('config', []).constant('appRoot', '/local/js/app');(este código seria gerada pelo seu servidor (você ainda pode gerá-lo como um arquivo JS, em vez de inlining no arquivo html) Então, suas cargas app este módulo e, portanto, tem acesso. appRoot.
Vojta
7

Eu achei o seguinte "padrão" muito útil:

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

onde MainCtrl é um controlador. Fico desconfortável ao confiar nos nomes dos parâmetros da função Controller, fazendo uma imitação um por um das instâncias, com medo de que eu possa mudar de nome e estragar tudo. Eu prefiro explicitamente usar $ inject para esse fim.

Ram Rajamony
fonte
Isso é legal; mas como você acessa MainCtrlassim?
precisa saber é o seguinte
Sei que seu comentário é antigo, mas vale a pena responder a perguntas para o futuro. Módulos / controladores pode ser definida como esta para que você possa acessá-los desta maneira:angular.module('myMod', []).controller('theController', controllerFunction); controllerFunction.$inject = []; function controllerFunction() { }
Mutmatt
1

Eu não sugiro que você use sintaxe como você fez. AngularJS permite-lhe ter diferentes funcionalidades como você quer ( run, config, service, factory, etc ..), que são mais professional.In esta função, você não tem sequer para injetar que por si mesmo como

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

você pode usá-lo, como você sabe.

Hazarapet Tunanyan
fonte