Angularjs 无法读取属性';喷油器';降级角度2服务时为空

Angularjs 无法读取属性';喷油器';降级角度2服务时为空,angularjs,angular,typescript,upgrade,downgrade,Angularjs,Angular,Typescript,Upgrade,Downgrade,各位。我需要帮助解决这个问题 我的angular 1.x app.js有这样的代码: angular.module('app', []); angular.module('app.test', ['app']) .config(($stateProvider) => $stateProvider.state('base', { url: '/', controller: 'TestStateCtrl

各位。我需要帮助解决这个问题

我的angular 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();

    });
以下是我的Angularng1服务代码:

    angular.module('app')
    .service('angularNg1Service',
        function (angularNg2Service} {
            //some code here 
}
My AngularNG2服务在Angular1.x模块的
功能启动之前降级

window['angular']
        .module('app')
        .factory(
            'angularNg2Service',
            upgradeAdapter.downgradeNg2Provider(AngularNg2Service)
        );
但是,我有一条错误消息:

无法读取null的属性“injector”

.run
角度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服务中。运行
函数。

您可以使用此处描述的解决方法:
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);
    });
将运行代码放入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方法的末尾更改bootstraped状态

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();
        };
    });

欢迎来到堆栈溢出!虽然这在理论上可以回答这个问题,但在这里包括答案的基本部分,并提供链接供参考。