#angular #ng-template #ng-container #ng-content
#angular #ng-шаблон #ng-контейнер #ng-содержимое
Вопрос:
Я создаю откидную панель. Панель состоит из трех частей.
- панель-панельинструментов
- панель-передняя
- панель-назад
На панели инструментов есть исправленная часть, кнопка переключения.
В моем flip-panel.component у меня есть ng-шаблон для панели инструментов, потому что панель инструментов должна отображаться с обеих сторон и должна быть одинаковой. Но я также использую ng-content в этом шаблоне для извлечения пользовательских элементов для панели инструментов.
Моя флип-панель.компонент:
<div class="flip-panel">
<div class="front-container">
<ng-container [ngTemplateOutlet]="headerTemplate"></ng-container>
<ng-content select="panel-front"></ng-content>
</div>
<div class="back-container">
<ng-container [ngTemplateOutlet]="headerTemplate"></ng-container>
<ng-content select="panel-back"></ng-content>
</div>
</div>
<!-- template used in both container front and back -->
<ng-template #headerTemplate>
<div class="flip-panel-header">
<span>
<ng-content select="panel-tool-bar"></ng-content>
</span>
<span class="flip-button" aria-hidden="true" (click)="toggle()">[Flip]</span>
</div>
</ng-template>
Проблема, с которой я сталкиваюсь, заключается в том, что пользовательские элементы на панели инструментов (выбранный контент из панели инструментов) отображаются только на обратной стороне содержимого.
Вот полный пример: https://stackblitz.com/edit/angular-fsnww2?file=src/app/app.component.html
Ответ №1:
вы можете использовать проекцию содержимого только один раз, и вы пытаетесь загрузить заголовок в оба через ng-content. Убедитесь, что, например, с помощью *ngIf содержимое проецируется только один раз.
Код для рабочего примера:
<div class="flip-panel">
<div class="front-container">
<ng-container *ngIf="flipped" [ngTemplateOutlet]="headerTemplate"></ng-container>
<ng-content select="panel-front"></ng-content>
</div>
<div class="back-container">
<ng-container *ngIf="!flipped" [ngTemplateOutlet]="headerTemplate"></ng-container>
<ng-content select="panel-back"></ng-content>
</div>
</div>