简体   繁体   中英

Angular Error: Error: Could not find column with id when it's in TS

In my app, I have a table with multiple columns. I'm trying to fill it with the respected data but when the page opens I get the error Could not find column with id "PublishedParty" yet, it's in the TS file. Here is my code, what is wrong with it?

HTML:

<ng-container *ngIf="isPublishedParty == true" matColumnDef="PublishedParty">
    <th mat-header-cell *matHeaderCellDef mat-sort-header style="min-width: 100px !important;" [ngStyle]="{'color': 'black'}" style="text-align: center;">
      <b>
        Planlanan Miktar
      </b>
    </th>
    <td mat-cell *matCellDef="let row; let i = index" style="min-width: 100px !important;" style="text-align: center;">
      <div>
        Miktar: {{row.PublishedPartyQuantity | number}}
      </div>
      <div>
        Parti: {{row.PublishedPartyCount | number}}
      </div>
    </td>
</ng-container>

TS:

isPublishedParty = false;
private _materialPlan: IMaterialPlan = {};
@Input() 
set MaterialPlan(prm: IMaterialPlan){
  this._materialPlan = prm;
}

get MaterialPlan(): IMaterialPlan {
  return this._materialPlan;
}
displayedColumns: string[] = [
  'StockIntegrationCode',
  'ReceiptName',
  'PublishedParty',
];

dataSource: MatTableDataSource<IMaterialPlanReceiptResult>;
@ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;
@ViewChild(MatSort, { static: true }) sort: MatSort;


constructor(
) {
  if(this._materialPlan.IncludePlannedParty == true){
    this.isPublishedParty == true;
  }
}

For angular to render the table correctly isPublishedParty should be initialized as true. Otherwise *ngIf removes it from the template and you would get such an error. You could set isPublishedParty to false at later time, perhaps in ngAfterViewInit() cycle.

I think, the problem is, that you hide the ng-container when the condition in your constructor is false for "this._materialPlan.IncludePlannedParty".

So the solution could be, to remove the column name from the displayColumns array:

private _materialPlan: IMaterialPlan = {};
@Input()
set MaterialPlan(prm: IMaterialPlan){
    this._materialPlan = prm;
}

get MaterialPlan(): IMaterialPlan {
    return this._materialPlan;
}
displayedColumns: string[] = [];

dataSource: MatTableDataSource<IMaterialPlanReceiptResult>;
@ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;
@ViewChild(MatSort, { static: true }) sort: MatSort;


constructor(
) {
    this.displayedColumns = [
        'StockIntegrationCode',
        'ReceiptName',
    ];
    if(this._materialPlan.IncludePlannedParty == true){
        this.isPublishedParty == true;
        this.displayedColumns.push('PublishedParty');
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM