Angular:带抽象类的Injectable()装饰器

时间:2018-03-13 11:16:20

标签: angular typescript abstract-class injectable

我遇到了奇怪的情况,想讨论是否正确。 (请在最后查看小问题更新)

在角度4.3中,我有一些抽象类,它由几个角度分量扩展。它看起来像:

export abstract class SidePanel {
  protected prop1;
  protected prop2;

  protected method1() {
    //...
  };
}

@Component({
 // ...
})
export class SidePanelOne extends SidePanel {
 // body
}

@Component({
 // ...
})
export class SidePanelTwo extends SidePanel {
 // body
}

我想在父类SidePanel中添加一些常用功能,并且需要使用angular的Injector。所以我想做这样的事情:

export abstract class SidePanel {
  protected prop1;
  protected prop2;

  constructor(injector: Injector){
    this.prop1 = injector.get(MyClassName);
  }

  protected method1() {
    //...
  };
}

为了使我能够从儿童传递注射器:

@Component({
 // ...
})
export class SidePanelOne extends SidePanel {
 constructor(injector: Injector) {
   super(injector);
 }

 //rest of body
}

但是我不想这样做,因为我有太多的孩子,在这种情况下我必须在所有这些中添加Injector。 所以我找到了简单的解决方案(但不确定它是否正确):

@Injectable()
export abstract class SidePanel {
  protected prop1;
  protected prop2;

  constructor(injector: Injector){
    this.prop1 = injector.get(MyClassName);
  }

  protected method1() {
    //...
  };
}

@Component({
 // ...
})
export class SidePanelOne extends SidePanel {
  private test() {
    this.prop1.myClassMethod(); // works!
  }

 // rest of body
}

因此,我的子类(组件)不必拥有自己的构造函数,只能注入和传递Injector,一切正常。 但是在抽象类上应用Injectable()装饰器看起来很奇怪。

是否正确?

提前感谢您的意见。

更新14.03:

事实证明,对于上述情况,可以使用'空'组件装饰器而不是注入:

@Component({})
export abstract class SidePanel {
  // body
}

它也令人困惑:具有空元数据的组件意味着什么,使用它是正确的以及为什么所有参数都是可选的(甚至是选择器)?

0 个答案:

没有答案