大家。我需要帮助解决这个问题。
我的角度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在角度1.x模块启动的.run
函数之前降级:
window['angular']
.module('app')
.factory(
'angularNg2Service',
upgradeAdapter.downgradeNg2Provider(AngularNg2Service)
);
但是,我有一条错误消息:
无法读取null
的属性'injector'
当角度1.x模块的.run
功能启动时。
这是我的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服务。但问题仅在于注入到.run
函数中使用的Angular1服务的一个特定服务。
答案 0 :(得分: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();
};
});