AngularJS + RequireJS - неизвестный поставщик, Angular Bug?

0

Я получаю следующее исключение: "Неизвестный поставщик: authSvc", который появляется в моем файле config.js, который я опубликую ниже. Я понимаю, что эта ошибка означает, что мой модуль authSvc не был зарегистрирован и недоступен, но служба создается до того, как я попытаюсь ее вставить. Может кто-нибудь, пожалуйста, помогите мне? Я потерялся на этом... так что подумал, что я обращусь к SO. Благодарю.

index.html

<!doctype html>
<html class="no-js" lang="">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="x-ua-compatible" content="ie=edge">
        <title></title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <link rel="apple-touch-icon" href="apple-touch-icon.png">
        <!-- Place favicon.ico in the root directory -->

        <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
        <link rel="stylesheet" href="css/normalize.css">
        <link rel="stylesheet" href="css/main.css">
        <!-- <script src="js/vendor/modernizr-2.8.3.min.js"></script> -->
        <script data-main="js/main" src="js/vendor/require.js"></script>     
    </head>
    <body>
        <!--[if lt IE 8]>
            <p class="browserupgrade">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
        <![endif]-->
    <nav class="navbar navbar-inverse navbar-fixed-top" ng-controller="navCtrl">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="#">Brand</a>
        </div>
        <div id="navbar" class="navbar-collapse collapse">
            <ul class="nav navbar-nav navbar-right">
                <li><button class="btn btn-default navbar-btn" ng-click="login()">Login</button></li>
                <li><button class="btn btn-info navbar-btn" ng-click="register()">Register</button></li>
            </ul>
        </div><!--/.navbar-collapse -->
      </div>
    </nav>
        <div ng-view></div>
    </body>
</html>

main.js

require.config({

    paths: {
        'angular': 'vendor/angular',
        'domReady': 'vendor/domready',
        'angularRoute': 'vendor/angular-route',
        'angularLocalStorage': 'vendor/angular-local-storage',
        'bootstrapCss': 'vendor/bootstrap-css'
    },

    shim: {
        'angular': {
            exports: 'angular'
        },
        'angularRoute': {
            deps: ['angular']
        },
        'angularLocalStorage': {
            deps: ['angular']
        }
    },

    deps: ['./bootstrap']
});

bootstrap.js

require([
    'angular', 
    'app',
    'services/authSvc',
    'controllers/navCtrl',
    'controllers/landingPageCtrl',
    'controllers/homeCtrl',
    'controllers/loginCtrl',
    'config',
    'routes'
    ], function (angular) {
    'use strict';

    angular.element(document).ready(function () {
        angular.bootstrap(document, ['myApp']);
    });

});

app.js

define([
    'angular',
     'angularRoute',
     'angularLocalStorage'
 ], function(angular, angularRoute, angularLocalStorage) {

'use strict';

var app = angular.module('myApp', ['ngRoute', 'LocalStorageModule']);

return app;

});

authSvc.js

define(['app'], function(app) {

    app.service('authSvc', function($http, localStorageService) {

        this.setToken = function(token) {
            return localStorageService.set('token', token);
        }

        this.getToken = function() {
            return localStorageService.get('token');
        }

        this.login = function(username, password) {
            return $http.post('/api/login', {username: username, password: password});
        }

    });

    console.log('authSvc registered');

});

config.js

define(['app'], function(app) {
    'use strict';

    app.config(function($httpProvider, authSvc) {
        $httpProvider.interceptors.push(function($q) {
          return {
           'request': function(config) {
               // same as above
               //config.headers.token = authSvc.getToken();
               return config;
            },

            'response': function(response) {
               // same as above
               return response;
            }
          };
        });
    });

    console.log('config registered');

});
  • 0
    Если кто-то может помочь, мой проект полностью остановлен, пока я не смогу с этим разобраться. Я проверил сетевую панель моей консоли и все загружается в том порядке, в котором они находятся внутри bootstrap.js, что означает, что служба создается до вызова .config () с введенной службой. Не имеет никакого смысла, что это бросает Неизвестный поставщик
  • 0
    Обновление: возился, заметил, что authSvc работает нормально, когда вводится в контроллер, например navCtrl, просто выбрасывает Unknown Provider, когда вводится в .config (). Это ошибка?
Теги:
requirejs

1 ответ

1
Лучший ответ

Вы не можете вводить услуги в блоки конфигурации. Только провайдеры.

app
    .factory('yourInterceptor', yourInterceptor)
    .config(configureInterceptor);

function configureInterceptor($httpProvider) {
    $httpProvider.interceptors.push('yourInterceptor');
}

function yourInterceptor(authSvc) {
    return {
        'request': function (config) {
            // same as above
            //config.headers.token = authSvc.getToken();
            return config;
        },

        'response': function (response) {
            // same as above
            return response;
        }
    };
}

РЕДАКТИРОВАТЬ:

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

function yourInterceptor($injector) {
    return {
        'request': function (config) {
            var authService = $injector.get('authSvc');


            //config.headers.token = authSvc.getToken();
            return config;
        },

        'response': function (response) {
            // same as above
            return response;
        }
    };
}
  • 0
    Итак, если у меня есть служба, которая получает токен авторизации из локального хранилища, как я могу внедрить эту службу в перехватчик http внутри app.config ()? Благодарю.
  • 0
    Я думаю, что единственное решение - не использовать app.service ('authSvc', ...)?
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню