Пользовательский поставщик маршрутов, когда это не функция - PullRequest
1 голос
/ 30 мая 2019

Это обновленная версия вопроса с сегодняшнего утра.

У меня есть два отдельных модуля: «администратор» и «авторизация».В блоке авторизации провайдера я расширяю $routeProvider, чтобы прикрепить одинаковый маршрут ко всем определениям маршрутов.

Во-первых, здесь admin.js:

angular.module('authorization', [])
    .provider('$appRoute', function () {
        this.$get = function($routeProvider) {
            var universalResolves = {authorize: function($authorization) {
                    return $authorization.authorize();
                }};

            var extendedRouter = angular.extend({}, $routeProvider, {
                when: function(path, route) {
                    route.resolve = (route.resolve) ? route.resolve : {};
                    angular.extend(route.resolve, universalResolves);
                    $routeProvider.when(path, route);
                    return this;
                }
            });

            return new extendedRouter();
        }
    })
    .factory('$authorization', ['$http', '$location', function($http, $location) {

        var $authorization = {};

        $authorization.authorize = function() {

            var path = $location.path();

            return promise = $http.get('/svc/authorize/view?urlPath=' + path).then(function(response) {
                var data = response.data;
                if (response.data.result === 'NOT_AUTHORIZED') {
                    throw "NOT_AUTHORIZED";
                }

                return data;
            });

        };

        return $authorization;
    }]);

Далее, мой административный модуль:

angular.module('admin', ['ngRoute', 'ngSanitize', 'ngCsv'
        , 'authorization'
    ])

    .controller('mainCtrl', function() {

    })
    .config(['$routeProvider', '$appRouteProvider', function($routeProvider, $appRouteProvider) {

        // old definition that needs to be changed to $appRouteProvider
        $routeProvider.when('/login', {
            templateUrl: '/login/auth.html',
            controller: 'loginCtrl'
        });

        $appRouteProvider.when('/page', {
            templateUrl: 'page.tmpl.html',
            controller: 'pageCtrl'
        });

К сожалению, я получаю следующую ошибку:

Error: [$injector:modulerr] Failed to instantiate module app due to:
$appRouteProvider.when is not a function
@https://localhost:8443/admin.js:87:9
invoke@https://localhost:8443/js/angular/angular.js:4718:16
runInvokeQueue@https://localhost:8443/js/angular/angular.js:4611:11
loadModules/<@https://localhost:8443/js/angular/angular.js:4620:11
forEach@https://localhost:8443/js/angular/angular.js:321:11
loadModules@https://localhost:8443/js/angular/angular.js:4601:5
loadModules/<@https://localhost:8443/js/angular/angular.js:4618:40
forEach@https://localhost:8443/js/angular/angular.js:321:11
loadModules@https://localhost:8443/js/angular/angular.js:4601:5
createInjector@https://localhost:8443/js/angular/angular.js:4523:19
doBootstrap@https://localhost:8443/js/angular/angular.js:1758:20
bootstrap@https://localhost:8443/js/angular/angular.js:1779:12
angularInit@https://localhost:8443/js/angular/angular.js:1664:5
@https://localhost:8443/js/angular/angular.js:31763:5
j@https://localhost:8443/js/jquery/jquery.min.js:2:29566
g/</k<@https://localhost:8443/js/jquery/jquery.min.js:2:29882

Таким образом, он видит $ appRouteProvider, но только метод this.$get().Кто-нибудь может помочь?

Ответы [ 2 ]

3 голосов
/ 30 мая 2019

Что касается ошибки, провайдер $appRoute сам не предоставляет никаких методов (кроме $get). Так что это пустой объект провайдера конфигурации API.

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

С Документы углового провайдера :

myApp.provider('unicornLauncher', function UnicornLauncherProvider() {
  var useTinfoilShielding = false;

  // provider config api method.
  this.useTinfoilShielding = function(value) {
    useTinfoilShielding = !!value;
  };

  this.$get = ["apiToken", function unicornLauncherFactory(apiToken) {

    // let's assume that the UnicornLauncher constructor was also changed to
    // accept and use the useTinfoilShielding argument
    return new UnicornLauncher(apiToken, useTinfoilShielding);
  }];
});

Если вы хотите добавить дополнительные методы в провайдере, вы можете использовать this.when = ... или Angular.extends(this, ....), например.

0 голосов
/ 31 мая 2019

В итоге я выбрал более простое решение, чем расширение поставщика маршрутов.

В моем модуле «верхнего уровня» я изменил все маршруты следующим кодом:

angular.module('app'[])
    .run(function($route) {
        var keys = Object.keys($route.routes);
        keys.forEach(function(key) {
            var modifiedRoute = $route.routes[key];

            // if there's already a resolve function defined, don't overwrite it, just add a new one
            modifiedRoute.resolve = key.resolve?key.resolve:{};
            modifiedRoute.resolve.authorize = function($authorization) {
                return $authorization.authorize();
            }

            $route[key] = modifiedRoute;
        });
     });

Это работает, потому что маршруты уже были определены в других блоках модулей .config(), которые выполнялись до блока run(). Это немного некрасиво, но работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...