Angular10/AngularJS混合应用:能否将Angular10服务注入AngularJS控制器?
如何将Angular 10服务注入AngularJS控制器
可以将Angular 10的@Injectable服务注入AngularJS控制器,但需要先把Angular服务降级为AngularJS兼容的服务——AngularJS注入器无法直接识别Angular的原生服务,你遇到的$injector:unpr错误,本质就是AngularJS找不到对应服务的provider,因为没做降级处理。
具体实现步骤:
确认Angular服务的配置
确保你的Angular 10服务已正确声明为可注入,比如使用providedIn: 'root':import { Injectable } from '@angular/core'; @Injectable({ providedIn: 'root' }) export class MyService { fetchData() { return '从Angular 10服务获取的数据'; } }降级Angular服务
使用Angular升级工具包的downgradeInjectable方法,将Angular服务转换为AngularJS能识别的工厂服务。可以在app.module.ts或专门的升级文件中执行:import { downgradeInjectable } from '@angular/upgrade/static'; import { MyService } from './path/to/my.service'; import * as angular from 'angular'; // 关联到你的AngularJS模块 angular.module('yourAngularJSAppModule') .factory('myService', downgradeInjectable(MyService) as angular.Injectable<any>);在AngularJS控制器中注入使用
在AngularJS控制器中,使用降级后的服务名称(示例中是myService,小写驼峰)进行注入:angular.module('yourAngularJSAppModule') .controller('MyController', ['myService', function(myService) { // 调用Angular服务的方法 console.log(myService.fetchData()); }]);
关键注意事项:
- 降级后的服务名称要和AngularJS中注册的工厂名一致,不要直接使用Angular服务的类名(比如
MyService),这是导致你报错的核心原因。 - 确保
UpgradeModule已正确配置在Angular的AppModule中(你提到已实现反向注入,这一步应该已完成),Angular应用需先启动,再通过UpgradeModule启动AngularJS应用。
内容的提问来源于stack exchange,提问作者Anthony Park
相关产品推荐
相关产品推荐

