Skip to content

Commit 5259f22

Browse files
crisbetommalerba
authored andcommitted
fix(table): error in Ivy for coerced multiTemplateDataRows (#16047)
Fixes an error that is thrown by the table in Ivy, if `multiTemplateDataRows` is set as a static attribute. The timing for static attributes is slightly different in Ivy, which means that we need an extra null check. Fixes #16044.
1 parent 9519192 commit 5259f22

File tree

2 files changed

+65
-1
lines changed

2 files changed

+65
-1
lines changed

src/cdk/table/table.spec.ts

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -727,6 +727,14 @@ describe('CdkTable', () => {
727727
['', '5', '6'],
728728
]);
729729
});
730+
731+
it('should not throw when multiTemplateDataRows is coerced from a static value', () => {
732+
expect(() => {
733+
setupTableTestApp(CoercedMultiTemplateDataRows);
734+
fixture.detectChanges();
735+
}).not.toThrow();
736+
});
737+
730738
});
731739
});
732740

@@ -1625,6 +1633,59 @@ class WhenRowCdkTableApp {
16251633
}
16261634
}
16271635

1636+
@Component({
1637+
template: `
1638+
<cdk-table [dataSource]="dataSource" multiTemplateDataRows>
1639+
<ng-container cdkColumnDef="column_a">
1640+
<cdk-header-cell *cdkHeaderCellDef> Column A</cdk-header-cell>
1641+
<cdk-cell *cdkCellDef="let row"> {{row.a}}</cdk-cell>
1642+
</ng-container>
1643+
1644+
<ng-container cdkColumnDef="column_b">
1645+
<cdk-header-cell *cdkHeaderCellDef> Column B</cdk-header-cell>
1646+
<cdk-cell *cdkCellDef="let row"> {{row.b}}</cdk-cell>
1647+
</ng-container>
1648+
1649+
<ng-container cdkColumnDef="column_c">
1650+
<cdk-header-cell *cdkHeaderCellDef> Column C</cdk-header-cell>
1651+
<cdk-cell *cdkCellDef="let row"> {{row.c}}</cdk-cell>
1652+
</ng-container>
1653+
1654+
<ng-container cdkColumnDef="index1Column">
1655+
<cdk-header-cell *cdkHeaderCellDef> Column C</cdk-header-cell>
1656+
<cdk-cell *cdkCellDef> index_1_special_row</cdk-cell>
1657+
</ng-container>
1658+
1659+
<ng-container cdkColumnDef="c3Column">
1660+
<cdk-header-cell *cdkHeaderCellDef> Column C</cdk-header-cell>
1661+
<cdk-cell *cdkCellDef> c3_special_row</cdk-cell>
1662+
</ng-container>
1663+
1664+
<ng-container cdkColumnDef="index">
1665+
<cdk-header-cell *cdkHeaderCellDef> Index</cdk-header-cell>
1666+
<cdk-cell *cdkCellDef="let index = index"> {{index}}</cdk-cell>
1667+
</ng-container>
1668+
1669+
<ng-container cdkColumnDef="dataIndex">
1670+
<cdk-header-cell *cdkHeaderCellDef> Data Index</cdk-header-cell>
1671+
<cdk-cell *cdkCellDef="let dataIndex = dataIndex"> {{dataIndex}}</cdk-cell>
1672+
</ng-container>
1673+
1674+
<ng-container cdkColumnDef="renderIndex">
1675+
<cdk-header-cell *cdkHeaderCellDef> Render Index</cdk-header-cell>
1676+
<cdk-cell *cdkCellDef="let renderIndex = renderIndex"> {{renderIndex}}</cdk-cell>
1677+
</ng-container>
1678+
1679+
<cdk-header-row *cdkHeaderRowDef="columnsToRender"></cdk-header-row>
1680+
<cdk-row *cdkRowDef="let row; columns: columnsToRender"></cdk-row>
1681+
<cdk-row *cdkRowDef="let row; columns: columnsForIsIndex1Row; when: isIndex1"></cdk-row>
1682+
<cdk-row *cdkRowDef="let row; columns: columnsForHasC3Row; when: hasC3"></cdk-row>
1683+
</cdk-table>
1684+
`
1685+
})
1686+
class CoercedMultiTemplateDataRows extends WhenRowCdkTableApp {
1687+
}
1688+
16281689
@Component({
16291690
template: `
16301691
<cdk-table [dataSource]="dataSource">

src/cdk/table/table.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,10 @@ export class CdkTable<T> implements AfterContentChecked, CollectionViewer, OnDes
346346
}
347347
set multiTemplateDataRows(v: boolean) {
348348
this._multiTemplateDataRows = coerceBooleanProperty(v);
349-
if (this._rowOutlet.viewContainer.length) {
349+
350+
// In Ivy if this value is set via a static attribute (e.g. <table multiTemplateDataRows>),
351+
// this setter will be invoked before the row outlet has been defined hence the null check.
352+
if (this._rowOutlet && this._rowOutlet.viewContainer.length) {
350353
this._forceRenderDataRows();
351354
}
352355
}

0 commit comments

Comments
 (0)