Не удается добраться до $ 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?


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', ...];

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.