Thursday, October 27, 2022
HomeWordPress DevelopmentGuide lazy loading of Angular element and suppliers with Standalone APIs (with...

Guide lazy loading of Angular element and suppliers with Standalone APIs (with out NgModule) 🄢


With Angular Standalone APIs (launched in v14) it’s doable to manually lazy load a element (even with it’s dependency providers and suppliers), equally to how we might manually lazy load a NgModule. We simply must create ourselves a baby EnvironmentInjector (simulating what a lazy-loaded NgModule would do). That is additionally precisely what the Angular Router does since v14, when instantiating a element for a Route that has it is personal suppliers array.

TLDR: See the stackblitz instance of manually lazy loading a element with a service, with Standalone APIs.

For instance, as an example we’ve a barrel index.ts with gadgets that we need to lazy load all collectively – a element and a service. And let’s suppose the element is dependent upon the service.

// lazy/index.ts

export * from './lazy.service';
export * from './lazy.element';

// customized naming conference - export an array named `suppliers`:
export const suppliers = [LazyService];
Enter fullscreen mode

Exit fullscreen mode

Then we will lazy load this barrel and create a baby EnvironmentInjector (containing all barrel’s suppliers). In a while this injector can be utilized when instantiating the lazy element (so the element has the entry to the suppliers talked about above).

export class AppComponent {
  constructor(
    protected viewContainerRef: ViewContainerRef,
    protected injector: Injector,
    protected environmentInjector: EnvironmentInjector
  ) {}

  lazyLoadComponent() {
    // 1. lazy load the barrel file
    import('./lazy/index').then((lazyBarrel) => {

      // 2. create manually an `EnvironmentInjector` with all
      //      the `suppliers` exported from the lazy barrel.
      //      Move `this.environmentInjector` as a father or mother.
      const childEnvironmentInjector = createEnvironmentInjector(
        lazyBarrel.suppliers,
        this.environmentInjector,
        'Lazy Atmosphere Injector'
      );

      // 3. instantiate a lazy element, passing:
      //      the father or mother element's component `Injector`
      //      and the simply created little one `EnvironmentInjector`
      const lazyComponent = createComponent(lazyBarrel.LazyComponent, {
        environmentInjector: childEnvironmentInjector,
        elementInjector: this.injector,
      });

      // 4. connect the lazy element contained in the father or mother element
      this.viewContainerRef.insert(lazyComponent.hostView);
    });
  }
Enter fullscreen mode

Exit fullscreen mode



Routing-driven lazy loading – Angular 14 supply code evaluation

The above method is similar to how the Angular Router instantiates parts (not solely lazy-loaded) underneath the hood, since model 14. When matching an URL towards a Route that comprises an array of suppliers, Angular creates a baby EnvironmentInjector. In a while, when the <router-outlet> instantiates a element for the present Route, Angular takes the Routeā€˜s EnvironmentInjector (or the closest injector outlined within the father or mother Routes) after which it makes use of this EnvironmentInjector when making a element occasion, so the element has entry to the Routeā€˜s suppliers.

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

- Advertisment -
Google search engine

Most Popular

Recent Comments