Подтвердить что ты не робот

Angular JS - Сделать сервис глобально доступным с контроллеров и просмотра

Скажем, у нас есть следующая услуга:

myApp.factory('FooService', function () { ...

Затем, с контроллера, я бы сказал:

myApp.controller('FooCtrl', ['$scope', 'FooService', function ($scope, FooService) { ...

Вопрос из двух частей:

  • Глобальная доступность. Если у меня есть 100 контроллеров, и все они нуждаются в доступе к службе, я не хочу явно вводить ее 100 раз. Как я могу сделать сервис глобально доступным? Единственное, что я могу сейчас представить, - это обернуть его из области корня, которая побеждает цель.
  • Доступность из представления. Как я могу получить доступ к сервису из представления? Этот пост предлагает обернуть службу из контроллера. Если я иду на эту длину, кажется, я должен просто реализовать функциональность прямо в области корневого каталога?
4b9b3361

Ответ 1

Найдено разумное решение. Внесите его в метод начальной загрузки (run) и добавьте его в корневую область. Оттуда он будет доступен для всех контроллеров и представлений.

myApp.run(function ($rootScope, $location, $http, $timeout, FooService) {
    $rootScope.foo = FooService;
    ....

Перечитав сообщение, о котором я упоминал выше, он не сказал "обернуть" точно... просто "абстрактно", поэтому я предполагаю, что плакат ссылался на это же решение.

Для тщательности ответ на (1) следующий:

myApp.controller('FooCtrl', ['$scope', function ($scope) { 
    // scope inherits from root scope
    $scope.foo.doSomething();
    ...

и ответ на (2) просто:

{{doSomething()}}

Ответ 2

Что касается доступа к службе непосредственно в представлении, это кажется чрезвычайно не-w500 > . Привязка его к переменной области видимости в контроллере кажется лучшим решением, чем использование службы непосредственно в пользовательском интерфейсе, что помогает поддерживать разделение обязанностей.

Ответ 3

Дополняя вопрос № 1 (глобальная доступность), я добавлю только, что, чтобы избежать проблем при минифинировании файла (если это так), он должен быть написан следующим образом:

this.app.run(["$rootScope", "Foo", function($rootScope, FooService) {
    return $rootScope.fooService = FooService;
  }
]);