Не удается прочитать свойство «инжектор» нулевого значения при понижении службы angular 2

каждый. Мне нужна помощь с такой проблемой.

У меня есть такой код для моего углового 1.x app.js:

angular.module('app', []);

angular.module('app.test', ['app'])
    .config(($stateProvider) => 
        $stateProvider.state('base', {
                url: '/',
                controller: 'TestStateCtrl',
                resolve: {
                    authenticationCheck: ['angularNg1Service', angularNg1Service=> {
                        angularNg1Service.test1();
                    }]
                }
            })
        })
    .run((angularNg1Service) => {
        angularNg1Service.test2();

    });

Вот код моего angularNg1Service:

    angular.module('app')
    .service('angularNg1Service',
        function (angularNg2Service} {
            //some code here 
}

Мой angularNg2Service понижен до запуска функции .run модуля angular 1.x:

window['angular']
        .module('app')
        .factory(
            'angularNg2Service',
            upgradeAdapter.downgradeNg2Provider(AngularNg2Service)
        );

Но у меня есть сообщение об ошибке:

Не удается прочитать свойство «инжектор» нулевого значения

Когда запускается функция .run модуля angular 1.x.

Вот мой файл main.ts:

import { upgradeAdapter } from './upgradeAdapter';
import { bootstrapNg1Components } from './app/ng1Components';    
bootstrapNg1Components(upgradeAdapter);// this function downgarades my AngularNg2Service

upgradeAdapter.bootstrap(document.querySelector('html'), ['app.start']);

Я читал некоторые подобные проблемы, но не нашел никакого решения.

Также у меня есть много сервисов Angular2, которые были понижены. Но проблема заключается только в одном конкретном сервисе, который внедряется в сервис Angular1, который используется в функции .run.


person Nikita Zhuykov    schedule 16.11.2017    source источник


Ответы (1)


Вы можете использовать обходной путь, описанный здесь https://github.com/angular/angular/issues/10992: поместите свой код запуска в функцию setTimeout.

angular.module('app.test', ['app'])
...
    .run(($injector) => {
        setTimeout(function() {
           var angularNg1Service = $injector.get('angularNg1Service');
           angularNg1Service.doSmth();
           // downgraded angularNg2Service is available here
           // inside of async function that will run after module.run method
           var angularNg2Service = $injector.get('angularNg2Service');
        },0);
    });

Чтобы убедиться, что состояние приложения не запускается до того, как приложение будет настроено (выполняется в методе запуска), вы можете добавить разрешение для каждого состояния.

angular.module('app.test', ['app'])
    .config(($stateProvider) => 
        $stateProvider.state('base', {
            url: '/',
            controller: 'TestStateCtrl',
            resolve: {
                appBootstrapped: ['appBootstrapStateService', () => {
                    return appBootstrapStateService.statePromise;
                ]},
                authenticationCheck: ['angularNg1Service', 'appBootstrapped', (angularNg1Service, appBootstrapped) => {
                    angularNg1Service.test1();
                }]
            }
        })
    })

И чтобы это работало, вы должны изменить состояние начальной загрузки в конце метода module.run.

angular.module('app.test', ['app'])
    ...
    .run(($injector) => {
        setTimeout(function() {
            ...
            var appBootstrapStateService = $injector.get('appBootstrapStateService');
            appBootstrapStateService.complete(); // allow state work
        },0);
    });

appBootstrapStateService - это служба angularJS, такая как

angular.module('app')
    .service('appBootstrapStateService', function () {
        const stateSubject = new Rx.Subject();
        this.statePromise = stateSubject.asObservable().toPromise();

        this.complete = () => {
            stateSubject.complete();
        };
    });
person Roman Makarov    schedule 21.06.2019
comment
Добро пожаловать в Stack Overflow! Хотя теоретически это может ответить на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для справки. . - person Anton Menshov; 21.06.2019