Seems I provide too much information, the main question is how can I call a method in the child component from the parent template click() event.
<button(click)='get()'>GET</button>
My parent has his own get(), which is empty. And my child has a customize get(), which is functional. I thought the child's get() will override the parent's because of the extends. But the parents button click() still call the own parent get().
I found some similar solution working with @ViewChild, but my parent is use for many different child component, so I can't declare the @ViewChildproperty like this:
@ViewChild(ChildCmp) child:ChildCmp
The ChildCmp is not specific, I can't declare it with just one child.
If you wanna know my whole skeleton, just keep look the below.
My parent component template like this:
<button(click)='get()'>GET</button>
<h1>{{header}}</h1>
<table mat-table [dataSource]='dataSource'>
    <ng-content></ng-content>
    <tr mat-header-row *matHeaderRowDef='displayedColumns;sticky:true'></tr>
    <tr mat-row *matRowDef='let row;columns:displayedColumns;'></tr>
</table>
parent class like this:
@Component({
  selector: 'app-base-management',
  templateUrl: './base-management.component.html',
  styleUrls: ['./base-management.component.css']
})
export class BaseManagementComponent implements OnInit, AfterContentInit {
  @Input() header = 'this is Header';
  @Input() displayedColumns: string[];
  @Input() dataSource: MatTableDataSource<any>;
  @ViewChild(MatTable, { static: true }) table: MatTable<MatTableDataSource<any>>;
  @ContentChildren(MatColumnDef) columnDefs: QueryList<MatColumnDef>;
  constructor() { }
  ngOnInit(): void { }
  ngAfterContentInit() {
    this.columnDefs.forEach(columnDef => this.table.addColumnDef(columnDef));
  }
  get() { }
}
Also my child component template:
<app-base-management [header]="header" [displayedColumns]="displayedColumns" [dataSource]="dataSource">
  <ng-container matColumnDef="position">
    <th mat-header-cell *matHeaderCellDef> No. </th>
    <td mat-cell *matCellDef="let element; let i= index;">{{cal(i)}} </td>
  </ng-container>
  <ng-container matColumnDef="br_no">
    <th mat-header-cell *matHeaderCellDef> br_no </th>
    <td mat-cell *matCellDef="let element"> {{element.pk_br_no}} </td>
  </ng-container>
  <ng-container matColumnDef="name_tc">
    <th mat-header-cell *matHeaderCellDef> name_tc </th>
    <td mat-cell *matCellDef="let element"> {{element.name_tc}} </td>
  </ng-container>
  <ng-container matColumnDef="name_en">
    <th mat-header-cell *matHeaderCellDef> name_en </th>
    <td mat-cell *matCellDef="let element"> {{element.name_en}} </td>
  </ng-container>
</app-base-management>
My child component class:
@Component({
  selector: 'app-child-a-management',
  templateUrl: './child-a-management.component.html',
  styleUrls: ['./child-a-management.component.css']
})
export class TxpManagementComponent extends BaseManagementComponent implements OnInit {
  displayedColumns: string[] = ['position', 'br_no', 'name_tc', 'name_en'];
  dataSource = new MatTableDataSource<any>();
  header = 'Child A';
  constructor() {}
  ngOnInit(): void {}
  get() {
    ...
    ...
    ...
  }
}
I want to keep the skeleton in the parent, and child store the table column definition and the customize method.
First of all, I thought the get() in child will override the parent's get() for the extends, but it didn't.
And I can't use the solution in this post, because my child component is non-specific, so i can't declare the @viewchild with specific class type.
 @ViewChild(ChildCmp) child:ChildCmp;
call-child-component-method-from-parent-class-angular
How can I call the child's get() from the parent's button click()? Or should I change the skeleton design?
 
    