You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular10/AngularJS混合应用:能否将Angular10服务注入AngularJS控制器?

如何将Angular 10服务注入AngularJS控制器

可以将Angular 10的@Injectable服务注入AngularJS控制器,但需要先把Angular服务降级为AngularJS兼容的服务——AngularJS注入器无法直接识别Angular的原生服务,你遇到的$injector:unpr错误,本质就是AngularJS找不到对应服务的provider,因为没做降级处理。

具体实现步骤:

  1. 确认Angular服务的配置
    确保你的Angular 10服务已正确声明为可注入,比如使用providedIn: 'root':

    import { Injectable } from '@angular/core';
    
    @Injectable({ providedIn: 'root' })
    export class MyService {
      fetchData() {
        return '从Angular 10服务获取的数据';
      }
    }
    
  2. 降级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>);
    
  3. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:31:50