Skip to content

bug(Dialog): Explicit injector does not work #25262

@adzhiljano

Description

@adzhiljano

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:

const userInjector = config.injector ?? config.viewContainerRef?.injector;

but not when creating/attaching the actual content component:
const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;

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!

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2The issue is important to a large percentage of users, with a workaroundarea: material/dialog

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions