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

162

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

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

Malvolio
источник
114
+1 за WTF в качестве нижней строки.
Элиран Малка

Ответы:

307

Вы не можете спросить, например, на этапе настройки - вы можете спросить только о поставщиках.

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 для получения дополнительной информации.

Войта
источник
9
Спасибо, это имеет смысл, но как ты это узнал? Это было в документах?
Мальволио
143
@ Маволио Нет, он один из трех разработчиков ядра.
ChrisOdney
8
Что ж, FWIW, это сейчас в документации, в разделе «Загрузка модуля и зависимости».
Марк Райкок
1
@vojta Но что, если мне нужно передать параметр извне и использовать его внутри config? сказать корневой путь в приложении asp.net? Я просто не хочу использовать глобальные переменные и хотел использовать ng-init='root:<%= myroot %>'и использовать rootзначение в module.config.
vittore
7
@vittore Я думаю, что поместить эту «внешнюю» конфигурацию в глобальное окно - это хорошо. Или наличие одного модуля, который определяет все эти вещи, а затем вы загружаете его в свое приложение - например. angular.module('config', []).constant('appRoot', '/local/js/app');(этот код будет сгенерирован вашим сервером (вы даже можете сгенерировать его как файл JS, а не встраивать в html-файл). Затем ваше приложение загружает этот модуль и, следовательно, имеет доступ к нему appRoot.
Войта
7

Я нашел следующий «шаблон» очень полезным:

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

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

Рам Раджамони
источник
Это аккуратно; но как вы получаете доступ к MainCtrlэтому?
f1lt3r
Я знаю, что ваш комментарий устарел, но на будущее стоит отвечать на вопросы. Модули / контроллеры могут быть определены так, чтобы вы могли получить к ним доступ таким образом:angular.module('myMod', []).controller('theController', controllerFunction); controllerFunction.$inject = []; function controllerFunction() { }
Mutmatt
1

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

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

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

Азарапет Туанян
источник