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
相关产品推荐
相关产品推荐

