ContentChild 通过扩展抽象类

elz*_*zoy 2 children angular

我有两个不同的组件,它们扩展了一个通用组件。

AComponent extends BaseComponent {}
BComponent extends BaseComponent {}
Run Code Online (Sandbox Code Playgroud)

第三个组件具有 ng-content。

<wrapper>
  <a-component></a-component>
  <b-component></b-component>
</wrapper>
Run Code Online (Sandbox Code Playgroud)

不幸的是,这些组件在下面的场景中不可见。

WrapperComponent {
  @ContentChildren(BaseComponent) components;
}
Run Code Online (Sandbox Code Playgroud)

我不想创建具有特定类型(Acomponent、BComponnet)的ContentChild。

ysf*_*ysf 11

您可以使用别名提供程序作为解决方法。

按如下方式定义您的组件;

@Component({
  selector: 'a-component',
  templateUrl: './a.component.html',
  styleUrls: ['./a.component.css'],
  providers: [{ provide: BaseComponent, useExisting: AComponent }]
})
export class AComponent extends BaseComponent implements OnInit {
  constructor() {
    super();
    console.log("a created.");
  }

  ngOnInit() {}
}
Run Code Online (Sandbox Code Playgroud)

@Component({
  selector: 'b-component',
  templateUrl: './b.component.html',
  styleUrls: ['./b.component.css'],
  providers: [{ provide: BaseComponent, useExisting: BComponent }]
})
export class BComponent extends BaseComponent implements OnInit {
  constructor() {
    super();
    console.log("b created.");
  }

  ngOnInit() {}
}
Run Code Online (Sandbox Code Playgroud)

哪里BaseComponent

export abstract class BaseComponent {}
Run Code Online (Sandbox Code Playgroud)

使用它WrapperComponent如下

@Component({
  selector: 'wrapper',
  templateUrl: './wrapper.component.html',
  styleUrls: ['./wrapper.component.css']
})
export class WrapperComponent implements OnInit, AfterContentInit {
  @ContentChildren(BaseComponent) components;

  constructor() { }

  ngOnInit() { }

  ngAfterContentInit() {
    console.log("components: ", this.components.length);
  }
}
Run Code Online (Sandbox Code Playgroud)

这是一个工作演示https://stackblitz.com/edit/angular-ynqhwj