#angular #angular6 #angular7
#angular #angular6 #angular7
Вопрос:
Я открываю модальный файл двумя разными способами, например, Stackblitz:
- Вызов метода в компоненте, который вызывает модальную службу:
<button (click)="openModal()">Open Modal</button> export class AppComponent { constructor(private modalService: ModalService) { } openModal() { this.modalService.open(HelloComponent); } }
Модальный сервис создает компонент динамически.
- С помощью директивы, которая затем вызывает 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. Насколько я знаю, нет.