Не удается добраться до $rootScope

Следующий файл "работает" (смысл, что он не вызывает никаких ошибок):

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

но этот

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

дает ошибку:

Ошибка: неизвестный поставщик: $rootScope от modx
Исходный файл: http://code.angularjs.org/angular-1.0.0rc7.js
Линия: 2491

WTF?

Ответ 1

Вы не можете запрашивать экземпляр на этапе конфигурации - вы можете запросить только у поставщиков.

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

Подробнее см. http://docs.angularjs.org/guide/module.

Ответ 2

Я нашел, что следующий "шаблон" очень полезен:

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

где MainCtrl - это контроллер. Мне неудобно полагаться на имена параметров функции Controller, выполняющие однофамильную имитацию экземпляров, опасаясь, что я могу изменить имена и гадости. Я предпочитаю явно использовать $inject для этой цели.

Ответ 3

Я не предлагаю использовать синтаксис, как вы. AngularJs позволяет вам иметь разные функциональные возможности (run, config, service, factory и т.д.), Которые являются более профессиональными. В этой функции вам даже не нужно вводить себя как

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

вы можете использовать его, как вы знаете.