сервис, который строит компоненты - PullRequest
0 голосов
/ 22 мая 2018

Я получаю ошибку circular dependency в моей службе @ComponentBuilderService, потому что некоторые компоненты, в которые я импортирую, т.е. BreakComponent, LocationComponent, используют эту службу, а также импортируют эту @ComponentBuilderService.

Я пытаюсь использовать метод buildComponents() внутри этого @ComponentBuilderService, чтобы иметь возможность динамически создавать компоненты, проблема в том, что некоторые компоненты должны использовать этот метод buildComponents() на этомтот же сервис для построения своих подкомпонентов.

@ ComponentBuilderService:

@Injectable()
export class ComponentBuilderService {
    private renderer: Renderer2;
    constructor(private resolver: ComponentFactoryResolver, renderFactory: RendererFactory2) {
        this.renderer = renderFactory.createRenderer(null, null);
    }
    buildComponents(nContainer: ViewContainerRef , elements) {
        // loop through elements creating different components based on element.Type
        elements.forEach((element, idx) => {
            switch (element.Type) {
                case 'break':
                    const breakComponent = nContainer.createComponent(this.resolver.resolveComponentFactory(BreakComponent));
                    console.log(breakComponent.location.nativeElement);
                    break;
                case 'location':
                    const locationComponent = nContainer.createComponent(this.resolver.resolveComponentFactory(LocationComponent));
                    locationComponent.instance.Elements = element.Elements;
                    break;
            }
        });
    }
}

@ LocationComponent:

import { Component, AfterContentInit } from '@angular/core';
import { ComponentBuilder } from '../../../shared/services/component-build.service';

@Component({
  selector: 'location',
  template: `<div> some location building </div>`,
  styleUrls: ['./location.component.scss'],
})
export class LocationComponent implements  AfterContentInit {
    Elements;
    constructor(private componentBuilder: ComponentBuilder) { }
    ngAfterContentInit() {
        console.log(this.Elements);
        this.componentBuilder.buildComponents(this.Elements);
    }
}

Вопрос: Есть ли способ создать ComponentBuilderService?

...