即使我必须在我的 Angular 应用程序中调用 super() ,我如何将东西注入 parent class 构造函数?
How do I inject things into a parent class constructor even though I have to call super() in my Angular application?
我正在使用一个 Angular 应用程序,我正在尝试解决问题。我这里有这段代码:
export abstract class ListPageComponent {
...
constructor(protected ngZone: NgZone) {}
...
}
export class UserListPageComponent extends ListPageComponent {
...
constructor(protected ngZone: NgZone) {
super(ngZone);
}
...
}
问题是这会创建两个对 ngZone 的引用,一个在 child 中,一个在 parent 中。我想要做的是将 ngZone 视为 child 可以访问的 parent class 的成员(即一个引用,而不是两个)。
我不得不调用 super(ngZone)
因为 Typescript 不允许我遗漏它。所以我要么调用 super(ngZone)
要么调用 super()
,在这两种情况下我都没有将 ngZone 注入 parent 以便它可以在 parent 和 [=27] 之间共享=].
如果 ngZone 能以某种方式自动注入到 parent,那将解决我的问题,但我不确定该怎么做。任何帮助深表感谢。谢谢
我在这里要做的一个解决方法是创建一个可注入服务,负责创建共享的 NgZone class:
import { Injectable, NgZone } from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class SharedNgZoneService {
constructor(public ngZone: NgZone) { }
}
然后在您的两个组件中使用此服务。
你具体问的,正如你所说,是不可能的。 Angular 只会实例化具体的 classes.
但是为什么需要组件级别的继承呢?我假设您具有要在组件之间共享的通用功能。我会改变策略。为共享功能使用瞬态*服务,而不是基础 class(即组合而不是继承)。当然,您仍然需要将该服务注入所有曾经从基类继承的组件 class,但这还不错,因为您会将共享功能保留在一个地方。
- 瞬态服务 - 通过使用工厂提供服务,以便每个组件实例获得其自己的服务实例。这最接近于有基数 class.
的初衷
providers: [
{
provide: ListPageService,
useFactory: (zone: NgZone) => new ListPageService(zone),
deps: [NgZone]
}
]
我正在使用一个 Angular 应用程序,我正在尝试解决问题。我这里有这段代码:
export abstract class ListPageComponent {
...
constructor(protected ngZone: NgZone) {}
...
}
export class UserListPageComponent extends ListPageComponent {
...
constructor(protected ngZone: NgZone) {
super(ngZone);
}
...
}
问题是这会创建两个对 ngZone 的引用,一个在 child 中,一个在 parent 中。我想要做的是将 ngZone 视为 child 可以访问的 parent class 的成员(即一个引用,而不是两个)。
我不得不调用 super(ngZone)
因为 Typescript 不允许我遗漏它。所以我要么调用 super(ngZone)
要么调用 super()
,在这两种情况下我都没有将 ngZone 注入 parent 以便它可以在 parent 和 [=27] 之间共享=].
如果 ngZone 能以某种方式自动注入到 parent,那将解决我的问题,但我不确定该怎么做。任何帮助深表感谢。谢谢
我在这里要做的一个解决方法是创建一个可注入服务,负责创建共享的 NgZone class:
import { Injectable, NgZone } from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class SharedNgZoneService {
constructor(public ngZone: NgZone) { }
}
然后在您的两个组件中使用此服务。
你具体问的,正如你所说,是不可能的。 Angular 只会实例化具体的 classes.
但是为什么需要组件级别的继承呢?我假设您具有要在组件之间共享的通用功能。我会改变策略。为共享功能使用瞬态*服务,而不是基础 class(即组合而不是继承)。当然,您仍然需要将该服务注入所有曾经从基类继承的组件 class,但这还不错,因为您会将共享功能保留在一个地方。
- 瞬态服务 - 通过使用工厂提供服务,以便每个组件实例获得其自己的服务实例。这最接近于有基数 class. 的初衷
providers: [
{
provide: ListPageService,
useFactory: (zone: NgZone) => new ListPageService(zone),
deps: [NgZone]
}
]