bug(Dialog): Explicit injector does not work
- Lingua principale
- TypeScript
- Stelle
- 25k
- Fork
- 6.8k
- Merge medio
- 1g 8h
- PR unite (30g)
- 91
Descrizione
### 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
Hey, I recently updated to v14 just for the newly added feature of the Dialog - the explicit injector, but it does not seem to work. I might be doing something wrong or misunderstood the new feature (to provide an `Injector` without having to provide a `ViewContainerRef`).
### Reproduction
Steps to reproduce:
Check out https://stackblitz.com/edit/angular-ozdqwy?file=src%2Fapp%2Fdialog-overview-example.ts (hope this lives long enough)
**OR**
1. Open the dialog example https://stackblitz.com/run?file=src/app/dialog-overview-example.ts
2. Add some service `@Injectable()
export class SomeService {
test = 123;
}`
3. Create an injector `const myInjector = Injector.create({
providers: [{ provide: SomeService }]
});`
4. Pass the injector `injector: myInjector`` to ``this.dialog.open`
5. Require the service `public someService: SomeService` in `DialogOverviewExampleDialog`'s constructor
### Expected Behavior
`SomeService` gets provided to `DialogOverviewExampleDialog`
### Actual Behavior
```
ERROR NullInjectorError: R3InjectorError(AppModule)[SomeService -> SomeService -> SomeService]:
NullInjectorError: No provider for SomeService!
at NullInjector.get (vendor.js:66456:21)
at R3Injector.get (vendor.js:66652:27)
at R3Injector.get (vendor.js:66652:27)
at R3Injector.get (vendor.js:66652:27)
at NgModuleRef.get (vendor.js:81766:29)
at ChainedInjector.get (vendor.js:81534:32)
at lookupTokenUsingModuleInjector (vendor.js:59680:31)
at getOrCreateInjectable (vendor.js:59732:10)
at Module.ɵɵdirectiveInject (vendor.js:67961:10)
at NodeInjectorFactory.DialogOverviewExampleDialog_Factory [as factory] (main.js:153:195)
```
### Environment
Angular CLI: 14.0.5
Angular: 14.0.5
Angular Material: 14.0.4
Node: 16.13.0
Package Manager: npm 8.1.0
OS: win32 x64
### Additional info
I glanced into the source code and I think the injector from the config is taken into account only when creating/attaching the
container:
https://github.com/angular/components/blob/c28bbdeb51c31cbd1f5e06528ef4d21b1650e4a8/src/cdk/dialog/dialog.ts#L224
but not when creating/attaching the actual content component:
https://github.com/angular/components/blob/c28bbdeb51c31cbd1f5e06528ef4d21b1650e4a8/src/cdk/dialog/dialog.ts#L311
and it seems that from a DI point of view, the implementation does not tie the content's Injector with the container's Injector. Again, I might be wrong.
Thanks!
Guida per i contributori
Apri la guida per i contributori
Direzione di ricerca
Inizia da src/cdk/dialog/dialog.ts alle righe indicate 224 e 311, quindi riproduci il problema usando l’esempio StackBlitz collegato e la relativa configurazione esplicita di Injector. Il lavoro è completato quando il provider SomeService fornito tramite l’Injector esplicito è disponibile per DialogOverviewExampleDialog senza che si verifichi un NullInjectorError.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- angular, typescript
- Ambito
- frontend
- Tipo di issue
- Bug
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 45/100