@NgModule.Компоненты и компоненты, созданные динамически

#angular #angular6 #angular7

#angular #angular6 #angular7

Вопрос:

Я открываю модальный файл двумя разными способами, например, Stackblitz:

  1. Вызов метода в компоненте, который вызывает модальную службу:
     <button (click)="openModal()">Open Modal</button>
    
    export class AppComponent  {
    
      constructor(private modalService: ModalService) { }
    
      openModal() {
        this.modalService.open(HelloComponent);
      }
    
    }
     

    Модальный сервис создает компонент динамически.

  2. С помощью директивы, которая затем вызывает ModalService:
     <button [modal]="'HelloComponent'">Open Modal</button>
    
    @Directive({
      selector: '[modal]'
    })
    
    export class ModalDirective {
    
      @Input('modal') identifier: string;
    
      constructor(private modalService: ModalService) { }
    
      @HostListener('click', ['$event'])
      clickEvent(event) {
    
        event.preventDefault();
        event.stopPropagation();
        this.modalService.open(this.identifier);
    
      }
    
    }
     

Опция (1) работает нормально, но опция (2) возвращает ошибку:

 Error: No component factory found for HelloComponent. Did you add it to @NgModule.entryComponents?
 

У меня в моем AppModule есть следующее:

 @NgModule({
  imports:      [ BrowserModule, FormsModule ],
  exports:      [ ModalDirective ],
  declarations: [ AppComponent, HelloComponent, ModalDirective ],
  entryComponents: [HelloComponent],
  bootstrap:    [ AppComponent ]
})
 

Поэтому я не уверен, почему это не работает…

Ответ №1:

Вам нужно указать псевдоним ссылки HelloComponent .

Обновить app.component

 export class AppComponent  {

  modalComp = HelloComponent;

  constructor(private modalService: ModalService) { }

  openModal() {
    this.modalService.open(this.modalComp);
  }

}
 

и шаблон:

 <div style="text-align:center">
  <h1>Modal Example</h1>

  <button (click)="openModal()">Open Modal</button>

  <button [modal]="modalComp">Open Modal</button>

</div>
 

Обновлен stackblitz: https://stackblitz.com/edit/mk-angular-modal-service-bzn8z7?file=src/app/app.component.html

Комментарии:

1. Нет ли другого варианта, определяющего псевдоним?

2. Насколько я знаю, нет.