AngularJS обновляет неизвестного поставщика после изменения начальной загрузки

#angularjs #angular-upgrade #angular-hybrid

Вопрос:

Я пытаюсь обновить большой angular.js приложение (1.5.9) до последней версии Angular.

Я нахожусь в процессе превращения приложения в гибридное приложение AngularJS/Angular и достиг этого шага в руководстве:

https://angular.io/guide/upgrade#bootstrapping-hybrid-applications

До сих пор я перешел с использования gulp на webpack 4, и приложение работает так же, как и раньше.

Проблема, с которой я сталкиваюсь, заключается в том, что я переключаюсь с использования директивы ng-app в своем index.html для начальной загрузки в Javascript приложение не запускается, что приводит к этой ошибке:

Неперехваченная ошибка: [$инжектор:unpr] Неизвестный поставщик: Поставщик государственных услуг

Это исходит от моего app.js файл, который выглядит следующим образом:

 angular.module('app-engine', [
    'app-engine.state',
    'app-engine.api',
    // other modules
])
.factory('bestInterceptor', bestInterceptor)
// other configs which aren't throwing Unknown provider errors
.run(startUp);

bestInterceptor.$inject = ['StateBootstrappingService'];

function bestInterceptor(StateBootstrappingService) {
    return {
        request: config => {
            if (!StateBootstrappingService.isBestSsoOn()) {
                config.headers['x-impersonated-user'] = StateBootstrappingService.getUserName();
            }
            return config;
        }
    };
}

startUp.$inject = ['$rootScope', '$state', '$timeout', 'StateService']

function startUp($rootScope, $state, $timeout, StateService) {
    // start up code
}
 

Существует отдельный app.modules.js файл, который определяет другие модули в приложении.

Включая:

 angular.module('app-engine.state', ['rx', 'app-engine.api']);
 

Услуга, упомянутая в ошибке Неизвестного поставщика, выглядит следующим образом:

 (function() {
    'use strict';
    angular
        .module('app-engine.state')
        .factory('StateService', StateService);

    StateService.$inject = [
        '$state',
        '$log',
        'rx',
        // a few other services that exist in the app
    ];

    function StateService(
         // all the above in $inject
    ) {
         // service code
    }
})();
 

Как указано в руководстве, я удаляю ng-app=»app-engine» из своего index.html и вместо этого добавляю его в JavaScript. Я добавил его внизу на своем app.modules.js файл.

 angular.bootstrap(document.body, ['app-engine']);
 

После этого изменения возникает ошибка неизвестного поставщика. Я подтвердил, что источником является моя функция запуска в app.js. Я попытался включить все модули в приложение в массив «app-engine», который ничего не изменил. Интересно, что функция bestInterceptor не выдает никаких ошибок, несмотря на то, что также использует службу (служба загрузки состояния настраивается так же, как и служба состояния).

Есть ли что-то очевидное, что я делаю неправильно? Или у кого-нибудь есть какие-либо идеи, как это решить?

Ответ №1:

Попробуйте это:

 angular.element(document).ready(function () {
  angular.bootstrap(document.body, ['app-engine'])
})
 

Для меня это было необходимо, потому что другие субкомпоненты (поставщики и службы) еще не были добавлены в модуль. Запуск it в «document.ready()» дает этим элементам возможность прикрепиться перед попыткой загрузки вручную (поскольку они не могут быть добавлены позже при загрузке вручную).

Мне не нравится использование document.ready() , поэтому я все еще ищу более официальный способ сделать это