File

projects/storefrontlib/cms-structure/page/component/services/component-handler.service.ts

Description

Responsible for obtaining component handler for specified component mapping

Index

Properties
Methods

Constructor

constructor(handlers: ComponentHandler[])
Parameters :
Name Type Optional
handlers ComponentHandler[] No

Methods

getLauncher
getLauncher(componentMapping: CmsComponentMapping, viewContainerRef: ViewContainerRef, elementInjector?: Injector, module?: NgModuleRef<any>)

Get launcher for specified component mapping

Parameters :
Name Type Optional
componentMapping CmsComponentMapping No
viewContainerRef ViewContainerRef No
elementInjector Injector Yes
module NgModuleRef<any> Yes
Returns : Observable<literal type>
Protected resolve
resolve(componentMapping: CmsComponentMapping)

Get best matching component handler

Parameters :
Name Type Optional
componentMapping CmsComponentMapping No
Returns : ComponentHandler

Properties

Protected invalidMappings
Default value : new Set<CmsComponentMapping<any>>()
import {
  ComponentRef,
  ElementRef,
  Inject,
  Injectable,
  Injector,
  isDevMode,
  NgModuleRef,
  Optional,
  ViewContainerRef,
} from '@angular/core';
import { CmsComponentMapping, resolveApplicable } from '@spartacus/core';
import { Observable } from 'rxjs';
import { ComponentHandler } from '../handlers/component-handler';

/**
 * Responsible for obtaining component handler for specified component mapping
 */
@Injectable({
  providedIn: 'root',
})
export class ComponentHandlerService {
  constructor(
    @Optional()
    @Inject(ComponentHandler)
    protected handlers: ComponentHandler[]
  ) {}

  protected invalidMappings = new Set<CmsComponentMapping<any>>();

  /**
   * Get best matching component handler
   *
   * @param componentMapping
   */
  protected resolve(componentMapping: CmsComponentMapping): ComponentHandler {
    const handler = resolveApplicable(this.handlers, [componentMapping]);

    if (isDevMode() && !handler) {
      if (!this.invalidMappings.has(componentMapping)) {
        this.invalidMappings.add(componentMapping);
        console.warn(
          "Can't resolve handler for component mapping: ",
          componentMapping
        );
      }
    }

    return handler;
  }

  /**
   * Get launcher for specified component mapping
   *
   * @param componentMapping
   * @param viewContainerRef
   * @param elementInjector
   */
  getLauncher(
    componentMapping: CmsComponentMapping,
    viewContainerRef: ViewContainerRef,
    elementInjector?: Injector,
    module?: NgModuleRef<any>
  ): Observable<{ elementRef: ElementRef; componentRef?: ComponentRef<any> }> {
    return this.resolve(componentMapping)?.launcher(
      componentMapping,
      viewContainerRef,
      elementInjector,
      module
    );
  }
}

result-matching ""

    No results matching ""