Angular应用中子类调用super()时如何向父类构造器注入共享依赖
Angular类继承场景下依赖注入重复引用解决方案
方案1:移除子类注入参数的访问修饰符(最简单)
父类代码保持不变:
export abstract class ListPageComponent { // ... constructor(protected ngZone: NgZone) {} // ... }
子类构造函数的ngZone参数不要加protected/public/private等访问修饰符,仅作为普通参数传递给父类即可:
export class UserListPageComponent extends ListPageComponent { // ... constructor(ngZone: NgZone) { super(ngZone); } // 子类中可直接通过this.ngZone访问父类声明的成员,不会生成额外的实例引用 // ... }
方案2:父类通过Injector自行获取依赖(适合父类依赖较多的场景)
如果不想每次子类都要手动传递父类的所有依赖,可以让父类直接注入Injector自行完成依赖查找:
import { Injector, NgZone } from '@angular/core'; export abstract class ListPageComponent { protected ngZone: NgZone; // ... constructor(injector: Injector) { this.ngZone = injector.get(NgZone); } // ... }
子类只需注入Injector传递给父类即可,不需要再单独处理NgZone的注入逻辑:
export class UserListPageComponent extends ListPageComponent { // ... constructor(injector: Injector) { super(injector); } // 直接访问this.ngZone即可,全程仅父类持有一份引用 // ... }
问题根因说明
你之前的写法中子类构造函数的ngZone参数添加了protected修饰符,TypeScript会自动将该参数声明为子类的实例属性,和父类声明的ngZone属性重复,才会出现两份引用的问题。去掉访问修饰符后该参数仅作为普通入参传递,不会生成额外的类属性。
内容的提问来源于stack exchange,提问作者gib65
相关产品推荐
相关产品推荐

