angular / angular/components

bug(table): Performance issue when paginator is set on AfterViewInit

Đang mở
#29,759 0 bình luận 0 reaction 0 người được giao Xem trên GitHub
area: material/table needs investigation P3 perf
Ngôn ngữ chính
TypeScript
Star
25k
Fork
6.8k
Merge trung bình
1 ngày 8 giờ
Pull request đã merge (30 ngày)
91

Mô tả

### Is this a regression?

- [ ] Yes, this behavior used to work in the previous version

### The previous version in which this bug was not present was

_No response_

### Description

According to [documentation](https://material.angular.io/components/table/overview#table-pagination) the recommended way of setting up a table with paginator is by doing this:

```
@ViewChild(MatPaginator) paginator: MatPaginator;
dataSource: MatTableDataSource;

ngOnInit(): void {
this.dataSource.data = this.getMillionsOfRows();
}

ngAfterViewInit() {
this.dataSource.paginator = this.paginator;
}
```

But because no paginator is defined until view is initialized, the whole table will be rendered the first time which can cause a significant performance issue.

In my case real-case project, I'm experiencing ~750ms to render 600 elements in a 8 columns table, and ~80 ms with workaround n°2.

### Workarounds
1. Use `@ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;` and set paginator to dataSource on init.
=> Does not work if paginator is in a conditional block (`@if` for example)
2. or, Set data to dataSource after view init.
=> Not great, the table will be rendered empty at first.

### Reproduction

Stackblitz link: https://material.angular.io/components/table/examples#table-overview
Steps to reproduce:
1. Open Material example in Stackblitz
2. Edit table-overview-example.ts and add the following method to the component:
```
test() {
console.log('test');
}
```
3. Edit table-overview-example.html and change the first `` tag to:
```
{{ test() }} {{row.id}}
```
4. Open browser the console and refresh the view

### Expected Behavior

5 logs, i.e. the page size.

### Actual Behavior

100 logs, i.e. the total number of elements.

### Environment

- Angular: >18
- CDK/Material: >18
- Browser(s): Chrome
- Operating System (e.g. Windows, macOS, Ubuntu): Windows

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Hướng nghiên cứu

Start with the Material table overview reproduction, then inspect table-overview-example.ts and table-overview-example.html as described. Run the example with the added test() call and compare the initial render logs with the expected five page-size logs rather than 100 total-row logs. Done means paginator setup no longer causes the full table to render first.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
angular, typescript
Lĩnh vực
frontend, performance
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
35/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.