angular / angular/components

bug(multiple): services provided in root are also provided in NgModules

オープン
#28,443 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る
area: many P3
主要言語
TypeScript
スター
25k
フォーク
6.8k
平均マージ
1日 8時間
マージ済み PR(30日)
91

説明

### 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

I am maintaining an Angular library built on top of Angular Material. Among others, this library includes custom components which are to be opened inside a dialog. Here is what the module of such a component looks like:

```typescript
@NgModule({
declarations: [MyComponent],
imports: [MatDialogModule],
export: [MyComponent],
})
export class MyModule {}
```

For applications which use that component in an NgModule, this works fine. However one of the applications is in the progress of migrating to standalone. After making the component standalone and adding `MyModule` to the `imports`, the unit tests involving the `MatDialog` service opening `MyComponent` failed. After investigation, I found out that the instance injected by the component constructor and the instance injected by `TestBed.inject()` are now two separate ones.

I have confirmed with the Angular core team that this is by design, see https://github.com/angular/angular/issues/53929.

The root cause is that `MatDialogModule` has `MatDialog` in its `providers`: https://github.com/angular/components/blob/b8cf1308571b29622422cd56f7f76b7bbc5ba5b1/src/material/dialog/module.ts#L34

IMHO it should be removed from the providers, as the service is `providedIn: 'root'`.

The `MatSnackBar` has the same issue, there might be more affected services in this repo.

### Reproduction

Repo: https://github.com/json-derulo/ng17-dialog-issue
Steps to reproduce:
1. Run `ng test`

### Expected Behavior

There is only one instance of `MatDialog` and the test case in the repro pass

### Actual Behavior

There are multiple instances of `MatDialog` and the test case in the repro fails

### Environment

Angular CLI: 17.0.10
Node: 18.18.2
Package Manager: npm 9.8.1
OS: darwin x64

Angular: 17.0.9
... animations, common, compiler, compiler-cli, core, forms
... platform-browser, platform-browser-dynamic, router

Package Version
---------------------------------------------------------
@angular-devkit/architect 0.1700.10
@angular-devkit/build-angular 17.0.10
@angular-devkit/core 17.0.10
@angular-devkit/schematics 17.0.10
@angular/cdk 17.1.0
@angular/cli 17.0.10
@angular/material 17.1.0
@schematics/angular 17.0.10
rxjs 7.8.1
typescript 5.2.2
zone.js 0.14.3

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

src/material/dialog/module.ts にあるリンク先の MatDialogModule 定義から始め、再現リポジトリで ng test を実行してください。MatDialog プロバイダーがどのように宣言されているか、また MatSnackBar やその他の影響を受けるサービスにも同じパターンがあるかを確認してください。再現コードに MatDialog インスタンスが 1 つだけ存在し、そのテストが成功すれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
angular, typescript
領域
frontend, testing
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。