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?


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.


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.