wenzel
wenzel

Reputation: 443

Angular - using forRoot({}) config in loadChildren() to configure a lazy-loaded module

I want to have a loaded module configurable. In theory, I want a module that is its own bigger application do receive some configuration. To show / load certain elements depending on the config the main application sends down.

I used that with other modules but those where not lazyLoaded. I tried and searched around and have not seen the usage of something like:

 children: [
      {
        path: 'application-module',
        loadChildren: () => import('@application-module').then(m => m.ApplicationModule.forRoot({
         foo:'bar'
        }))
      }
    ]

Is that even possible? If I use it I get the error error: Error: No NgModule metadata found for '[object Object]'. That is common when the module you load is not defined.

Or am I on the wrong track and there is a better solution for that? Thank you

Upvotes: 3

Views: 1832

Answers (3)

Eduard Void
Eduard Void

Reputation: 2714

since angular 14 you can add providers to the path:

children: [
  {
    path: 'application-module',
    loadChildren: () => import('@application-module').then(m => m.ApplicationModule),
    providers: [{ provide: MyFooInjectionToken, useValue: 'bar' }]
  }
]

Upvotes: 3

Mor Bargig
Mor Bargig

Reputation: 373

If the Module is in your code, just change the function return

@Module({})
export class ApplicationModule {
  static forRoot(): typeof ApplicationModule {

    return this;
  }
}

Upvotes: 0

Inge Olaisen
Inge Olaisen

Reputation: 89

I suppose one thing you can try, because what you're doing now won't work. Reason being that loadChildren expects a class with the @module decorator.

What you are giving it is a static function.

What you could try is to do this:

children: [
      {
        path: 'application-module',
        loadChildren: () => import('@application-module').then(m => { m.ApplicationModule.forRoot({foo: 'bar'}); return m.ApplicationModule; } )
    }))
      }
    ]

I have no idea if that will work though.

Another option is to go for a service or through routing in the receiving lazyloaded module route.

Upvotes: 4

Related Questions