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

Angular17服务升级:依赖注入相关问题咨询

Angular 17 服务升级相关问题解答

1. @Inject() 与 inject() 的区别

  • 使用场景差异:
    • @Inject()是参数装饰器,仅能在类的构造函数参数上使用,用来显式指定依赖的注入令牌。
    • inject()是独立函数,可在类的字段初始化、注入工厂函数、路由守卫等Angular注入上下文场景中调用,无需依赖构造函数。
  • 语法形式不同:
    • @Inject()需搭配构造函数参数使用,示例:constructor(@Inject(CUSTOM_TOKEN) private dep: DepType) {}
    • inject()直接调用赋值,示例:private dep = inject(CUSTOM_TOKEN)
  • 修饰器功能实现:
    • 构造函数中的@Optional()、@Self()等修饰器,需与@Inject()配合作用在参数上。
    • inject()通过第二个配置参数实现对应功能,比如inject(CUSTOM_TOKEN, { optional: true })等价于@Optional() @Inject(CUSTOM_TOKEN)。
  • 上下文限制:
    • inject()必须在Angular注入上下文内调用(如类初始化阶段、注入器创建时),若在普通事件处理方法中调用会报错;@Inject()无此限制,因为它在构造函数注入阶段处理。

2. 移除构造函数后的代码修改

原代码constructor(@Optional() @Inject(parameter) private window: Window) { ...code... }不能直接改成private window = inject(Window),也不能仅保留@Inject(parameter) private window: Window,正确修改方式如下:

  • 依赖注入部分:要保留@Optional()和@Inject(parameter)的效果,需用inject()的配置参数实现,写法为:
    private window = inject(parameter, { optional: true });
    
    注意这里用的是parameter而非Window,因为原代码通过自定义令牌parameter注入Window,不是直接注入Window类型。
  • 原构造函数内的逻辑:将...code...的初始化代码移到类的实例初始化块中,示例:
    export class YourService {
      private window = inject(parameter, { optional: true });
    
      {
        // 原构造函数内的代码移至此处
        if (this.window) {
          // 执行原初始化逻辑
        }
      }
    }
    
    若逻辑依赖其他注入服务,也可实现OnInit接口,在ngOnInit()方法中执行,需注意服务的ngOnInit会在首次注入时执行,与构造函数执行时机略有差异。

内容的提问来源于stack exchange,提问作者dluisely

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 05:58:21