Не вдається дістатися до $ 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
@Mavolio Ні, він один з трьох основних розробників.
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.
Vojta

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.