Как я могу вызвать службу из шаблона в AngularJS?

У меня есть служба, которая возвращает объект json, который он делает, для краткости позволяет сказать, что он выглядит так:

.service ('levelService', function () {

    // service to manage levels.
    return  {
        levels : [{name:'Base', href:'base'},{name:'Level 1', href:'level1'},{name:'level2', href:'level2'}]
    };

})

Я думаю, что все в порядке, но я хочу использовать его сейчас, в шаблоне. В настоящее время у меня есть что-то вроде этого:

<ul class="dropdown-menu" ng-init="levels = [{name:'Base', href:'base'},{name:'Level 1', href:'level1'},{name:'level2', href:'level2'}];">
                      <li ng-repeat="level in levels">
      <a ng-href="#/modeling/level/{{level.href}}">{{level.name}}</a></li>
                  </ul>

Как я могу заставить ng-init использовать службу? Я чувствую, что это правильно, добавляет сервис в контроллер, но это не доступно для любого контроллера. Нужно ли мне создавать новый контроллер для этого пространства или я могу напрямую ссылаться на службу?

Ответ 1

Да, было бы лучше всего создать контроллер.

Идея архитектуры приложения MVC заключается в том, что вы не плотно соединяете свои объекты/классы вместе. Внедрение службы в контроллер, а затем добавление вашего контроллера levels в $scope означает, что вашему HTML не нужно беспокоиться о том, откуда он получает данные.

Кроме того, использование ng-init таким образом, возможно, отлично подходит для быстрого запуска прототипа, но этот подход не должен использоваться в производственном коде (поскольку ваши данные модели тесно связаны с вашим HTML-представлением).

Совет. Возможно, неплохо было бы использовать контроллер для родительского контейнера вашего dropdown-menu (то есть страницы/раздела), а затем использовать директиву для самого dropdown-menu. Подумайте о директиве как компоненте вида.

В общем, вы можете найти видеоуроки в egghead.io.

Ответ 2

поместите сервис в контроллер. Затем вы можете вызвать услугу в своем шаблоне.

app.controller('yourCtrl', function($scope, levelService) {
   $scope.levelService= levelService;
});