В Angular 8 можно перекрыть компоненты, используя функцию компонента ViewContainerRef
и директиву ngTemplateOutlet
.
Перекрытие компонентов обычно происходит, когда вы хотите изменить отображение существующего компонента или добавить новую функциональность к существующим компонентам без изменения их исходного кода.
Чтобы перекрыть компоненты в Angular 8, выполните следующие шаги:
- Создайте новый компонент, который будет служить перекрывающим компонентом. Назовите его, например,
OverlayComponent
.
import { Component } from '@angular/core'; @Component({ selector: 'app-overlay', template: ` <ng-container #overlayContainer></ng-container> <ng-content></ng-content> ` }) export class OverlayComponent { // ... }
- В родительском компоненте, в котором вы хотите перекрыть компоненты, добавьте в
html
разметку элемент<app-overlay>
.
<app-overlay #overlay> <!-- Тут будут перекрывающие компоненты --> </app-overlay>
- Добавьте в родительский компонент ссылку на
OverlayComponent
с помощью@ViewChild
.
import { Component, ViewChild, ViewContainerRef } from '@angular/core'; @Component({ selector: 'app-parent', template: ` <app-overlay #overlay> <!-- Тут будут перекрывающие компоненты --> </app-overlay> ` }) export class ParentComponent { @ViewChild('overlay', {read: ViewContainerRef}) overlayContainer: ViewContainerRef; // ... }
- Используйте
ngTemplateOutlet
для отображения перекрывающего компонента вOverlayComponent
.
<ng-container #overlayContainer></ng-container>
import { Component, ViewChild, ViewContainerRef, TemplateRef } from '@angular/core'; @Component({ selector: 'app-overlay', template: ` <ng-container #overlayContainer></ng-container> <ng-content></ng-content> ` }) export class OverlayComponent { @ViewChild('overlayContainer', {read: ViewContainerRef}) overlayContainer: ViewContainerRef; // ... showOverlay(overlayContent: TemplateRef<any>) { this.overlayContainer.clear(); this.overlayContainer.createEmbeddedView(overlayContent); } }
- Теперь вы можете использовать метод
showOverlay
в родительском компоненте для отображения перекрывающего компонента вOverlayComponent
.
import { Component, ViewChild, ViewContainerRef, TemplateRef } from '@angular/core'; @Component({ selector: 'app-parent', template: ` <app-overlay #overlay> <!-- Тут будут перекрывающие компоненты --> </app-overlay> <button (click)="showOverlay()">Показать перекрытие</button> ` }) export class ParentComponent { @ViewChild('overlay', {read: ViewContainerRef}) overlayContainer: ViewContainerRef; @ViewChild('overlayContent') overlayContent: TemplateRef<any>; showOverlay() { this.overlayContainer.showOverlay(this.overlayContent); } }
Теперь, когда вы нажмете на кнопку "Показать перекрытие", компонент, заданный в шаблоне overlayContent
, будет отображаться в OverlayComponent
. Это позволяет вам изменять контент и добавлять дополнительные компоненты без изменения исходного кода.