bug(mat-tree): TreeControl's getChildren is called unexpectedly many times since cdk/material v18.2.0 and is especially problematic with asynchronous actions
- 主要言語
- TypeScript
- スター
- 25k
- フォーク
- 6.8k
- 平均マージ
- 1日 8時間
- マージ済み PR(30日)
- 91
説明
### Is this a regression?
- [x] Yes, this behavior used to work in the previous version
### The previous version in which this bug was not present was
18.1.5
### Description
I've recently upgraded a project's `@angular/cdk` & `@angular/material` packages to 18.2, and I noticed a problem with the `TreeControl` when `getChildren` was asynchronous: sometimes it would result in an infinite loop of asynchronous actions; other times, it would perform a very large number of asynchronous actions; previous to 18.2 (18.1.5 was the last version it worked as expected), it would have only started a single asynchronous action per node. This is especially noticeable when the asynchronous action involves some kind of XHR.
Looking a bit further into it, I noticed that synchronous `getChildren` calls have also regressed in 18.2.0: there are now a lot more calls to this method than in cdk/material 18.1.5.
### Reproduction
18.2.X:
StackBlitz link: [StackBlitz 18.2.X](https://stackblitz.com/edit/stackblitz-starters-acc226?file=src%2Fmain.ts)
Steps to reproduce:
1. Play around with the expand icons
2. Notice the number of calls to getChildren at the top of the rendered page - it increases wildly more than the previous minor cdk/material version, and sometimes enters a seemingly infinite loop
### Expected Behavior
There should be exactly 1 call to `getChildren` for each expanded node
18.1.X:
StackBlitz link: [StackBlitz 18.1.X](https://stackblitz.com/edit/stackblitz-starters-pkwrp2?file=src%2Fmain.ts)
Steps to reproduce:
1. Play around with the expand icons
2. Notice the number of calls to getChildren at the top of the rendered page - it increases by 1 for each expanded node
### Actual Behavior
The number of calls to `getChildren` increases wildly, and I've also managed to un-deterministically enter a seemingly infinite loop.
### Environment
- Angular: 18.X.Y (reproduced on 18.1.X and 18.2.X)
- CDK/Material: all versions since 18.2.0
- Browser(s): Google Chrome 130
- Operating System (e.g. Windows, macOS, Ubuntu): macOS
コントリビューションガイド
調査の方向性
リンクされた StackBlitz の再現を起点に、ノードを展開しながら 18.1.5 と 18.2.X の getChildren 呼び出し回数を比較します。getChildren を呼び出す mat-tree の TreeControl パスを追跡し、その後、修正によって非同期の子を含め、展開された各ノードに対して正確に 1 回の呼び出しが生成されることを確認します。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- angular, typescript
- 領域
- frontend
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100