我的头在这上面转了一圈。
我想创建类来表示从Angular(不是AngularJS)的后端返回的数据。
我有两个顶级课程Variation
和Reallocation
。两者都是基类Adjustment
的类型。因此,Variation
和Reallocation
都扩展 Adjustment
。大多数类定义位于Adjustment
类中,两个派生类之间只有很小但很重要的区别。
使用Adjustment
类处理与后端的大多数通信似乎很有意义。也就是说,说我想得到一个Variation
。我应该能够将id传递给getAdjustment
的{{1}}方法,并让它返回一个Variation
实例,该实例中填充了来自服务器的数据。
到目前为止,所有这些对我来说都是合乎逻辑的,我可以使其正常工作。
问题是我必须使用某种服务从后端获取数据。我碰巧正在使用AngularFirestore来获取数据。
因此,在我的Variation
类中,我必须包括以下几行内容:
Adjustment
然后的问题是,当我开始在派生类中使用super()时。我也必须将AngularFirestore注入到派生类中。也就是说,我必须拥有类似的东西:
constructor(
public afs: AngularFirestore,
....){}
export class Variation extends Adjustment {
....
constructor(
afs: AngularFirestore,
.... ) {}
super (afs,
....)
类实际上不需要了解有关AngularFirestore的任何信息,但我必须将其注入该类中才能使其被注入Variation
类中。
必须有一种避免这种情况的方法,但我只是想不通。
答案 0 :(得分:0)
我用以下内容替换了以前的答案:
我对注射器进行了更多研究,并找到了答案:https://stackoverflow.com/a/37482645/5348742。
我们知道Angular维护着整个应用程序的注射器。我们可以通过在所需的任何模块级别创建类型为Injector
的属性来访问此注入器。如果我们已在root
中注册了服务,则可以在app.module
中获得注入器。
通过这种方式,我们不必在构造函数中获取服务的注入器。
我们在app.module
中获得了对服务的引用,将其导出,然后在需要的地方使用它。
检查上面的链接以获取有关服务参考的更多详细信息。
就在应用程序中的其他地方使用它而言,类似这样。
在app.module
...
export let myService: MyService;
export class AppModule {
constructor(private router: Router,
private injector: Injector){
appInjector = this.injector;
myService = appInjector.get(MyService)
}
}
然后在要使用它的组件或类中:
import { myService } from 'app.module'
...
export class MyClass {
constructor(...){...}
getSomething(){
const something = myService.doSomething()
}
}
这样,我们可以使用服务,而不必在构造函数中声明它。