2013-08-16 4 views
5

Мне нужна помощь там. Я изучаю Angularjs и пытаюсь создать сервис. В настоящее время я пытаюсь разделить все в своих модулях. Когда я создаю новый модуль, называемый (bac.route-manager), и пытаюсь ввести его в конфигурацию приложения как RouterService, я получаю сообщение об ошибке, которое я не понимаю смысла и как его исправить. Все мои другие вещи, похоже, работают, за исключением случаев, когда я пытался добавить этот модуль, этот неизвестный поставщик начинает появляться только после того, как я попытаюсь его ввести. Пожалуйста, любая помощь приветствуется.angularjs Uncaught Error: Неизвестный поставщик:

Моя ошибка

Uncaught Error: Unknown provider: RouterService from bac 

Мои app.js файл

angular.module('bac', [ 
    'bac.route-manager' 
]) 

.config(function bacAppConfig($routeProvider, RouterService) { 

    //I dont knwo if i can do this but right now it doesnt matter because of error 
    console.log(RouterService.getRoutes()); 
}); 

Мой маршрут-manager.js файл

angular.module('bac.route-manager', []) 

.service('RouterService', function() { 

    this.getRoutes = function() { 
     return { 
       "/login": { 
      templateUrl: 'app/modules/login-manager/partials/login.tpl.html', 
      requiredLogin: false 
     }, 

     "/dashboard": { 
      templateUrl: 'app/modules/dashboard-manager/partials/dashboard.tpl.html', 
      controller: 'DashboardController', 
      requiredLogin: true 
     } 

     }; 

}; 

});

Я использую grunt для генерации js, содержится в моем html-файле, но вот что это похоже на много удаленных для краткости материалов.

Мой index.html

<html lang="en" class="no-js" ng-app="bac"> 
    <body> 
     <ng-view></ng-view> 

    <script type="text/javascript" src="vendor/angular/angular.js"></script> 
    <script type="text/javascript" src="app/app.js"></script> 
    <script type="text/javascript" src="app/modules/dashboard-manager/dashboard-manager.js"></script> 
    <script type="text/javascript" src="app/modules/route-manager/route-manager.js"></script> 

    </body> 
</html> 
+0

Попробуйте загрузить 'route-manager.js' перед' app.js' – AlwaysALearner

+0

Я просто попробовал это. Я сгенерировал файл index.html с хрюканьем, а затем вошел и вручную переместил файл route-manager.js выше всего, кроме файла app.js. Еще одна ошибка. Uncaught Error: Неизвестный поставщик: RouterService from bac – lumberjacked

+0

@Codezilla. Фаза конфигурации и запуска откладывается до тех пор, пока не будет загружен весь документ. Порядок, в котором они появляются, в этом случае не имеет значения. –

ответ

17

В config фазе услуги, объявленные еще не доступны. Только те, кто был объявлен с использованием provide, пройдут через serviceNameProvider (добавьте Provider после имени, которое вы определили). Например:

.provide('RouterService', function() { 
    var service = { }; 
    var routes = { 
    "/login": { 
     templateUrl: 'app/modules/login-manager/partials/login.tpl.html', 
     requiredLogin: false 
    }, 
    "/dashboard": { 
     templateUrl: 'app/modules/dashboard-manager/partials/dashboard.tpl.html', 
     controller: 'DashboardController', 
     requiredLogin: true 
    }}; 

    service.getRoutes = function() { return routes; }; 

    this.$get = function() { return service; } 

    this.setupRoute = function(data) { /* something here */ }; 
}; 

Когда вы получаете поставщик, весь метод, определенный на this будет доступен. Когда вы обращаетесь к обычной службе, то, что вводится, является возвратом функции $get. В зависимости от того, что вам нужно, вам необходимо либо изменить службу, чтобы использовать provide или попросить, чтобы вводить с обслуживанием в run метода:

angular.module('bac', ['bac.route-manager']) 
    .config(function ($routeProvider, RouterServiceProvider) { 
    // Here, only RouterServiceProvider.setupRoute will be available 
    }).run(function (RouterService) { 
    // Here, the service singleton return with the $get function will 
    // be injected 
    console.log(RouterService.getRoutes()); 
}); 

Edit

Как примечание стороны, я считаю, что даже если вы определили ваш RouterService как service, прося RouterServiceProvider бы работать, но ни один метод не будет присутствовать в качестве service, по существу, оболочка вокруг provider только вернуть функцию в $get

+0

Спасибо за ответ. Я собираюсь повторить фактор, и тогда я отмечу это как ответ. – lumberjacked

+0

Преобразование службы в поставщика работает. Но я смущен тем, как реализовать метод $ get. Внутри провайдера я добавил метод this.getRoutes(), чтобы я мог выполнить следующий цикл через объект для настройки маршрутов в $ routeProvider.На данный момент мне не нужен метод $ get, возможно, позже, но я не могу просто ввести RouterServiceProvider в контроллер, чтобы использовать метод this.getRoutes(). – lumberjacked

Смежные вопросы