Передача контекста в ng-template при использовании его локальной ссылки

У меня есть компонент, который выглядит так:

<nz-collapse>
  <nz-collapse-panel *ngFor = "let item of items" [nzHeader] = "collapseHeader">
    <div class = "item">
      <!-- some content here -->
    </div>
  </nz-collapse-panel>
</nz-collapse>

<ng-template #collapseHeader let-item>
  <nz-divider [nzText] = "item.name"></nz-divider>
</ng-template>

Как я могу передать каждый элемент в качестве контекста моему шаблону ng? библиотека не предлагает способ сделать это. (nzHeader принимает только строки и TemplateRef в качестве аргументов, никаких других типов представлений)

Я не могу найти чистый способ сделать это. Я предполагаю, что хакерский способ сделать это — создать небольшой компонент, который будет принимать «элемент» в качестве своего @Input(), а его HTML будет иметь элемент <nz-collapse-panel> в своем корне (без ngFor, очевидно, ), ng-контент внутри и ng-шаблон после. Шаблону больше не потребуется переменная шаблона, поскольку «элемент» определен в самом компоненте. Тогда ваша строка *ngFor относится к вашему компоненту, а не к nz-collapse-panel.

NicolasB 10.01.2023 17:11

@NicolasB Я думаю, что ваше решение на самом деле лучшее в этом случае, а вовсе не хакерское.

mohamedSdn 18.01.2023 15:51

@NicolasB, вы должны добавить это как ответ.

mohamedSdn 18.01.2023 16:19

Хорошо, я разместил это как ответ. Дайте мне знать, если все это работает хорошо.

NicolasB 18.01.2023 17:23
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Как я могу создать библиотеку angular и опубликовать ее или использовать локально
Как я могу создать библиотеку angular и опубликовать ее или использовать локально
Angular - это мощный фреймворк для создания веб-приложений. Одной из его ключевых особенностей является возможность создания и использования библиотек...
Promise v/s Observable в Angular
Promise v/s Observable в Angular
В системах Push производитель определяет, когда отправить данные потребителю. Потребитель не знает, когда он получит эти данные.
Angular: Публикация частной библиотеки Angular для совместного использования компонентов с помощью Verdaccio
Angular: Публикация частной библиотеки Angular для совместного использования компонентов с помощью Verdaccio
Совместное использование компонентов с помощью частной библиотеки в Angular
Angular Router - учебник для начинающих
Angular Router - учебник для начинающих
Angular Router - это мощный и гибкий инструмент для создания одностраничных приложений (SPA) с навигацией. Он позволяет легко управлять навигацией...
1
4
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Один из способов решить эту проблему — полностью обойти необходимость предоставления контекста шаблону. Вместо этого давайте поставим Input() компоненту, потому что это просто.

Давайте создадим CollapseWrapperComponent с app-collapse-wrapper-component в качестве селектора. Вот ts и html:

export class CollapseWrapperComponent {
  @Input() public item: Item;
}
<nz-collapse-panel [nzHeader] = "collapseHeader">
  <ng-content></ng-content>
</nz-collapse-panel>

<ng-template #collapseHeader>
  <nz-divider [nzText] = "item.name"></nz-divider>
</ng-template>

И затем в родительском компоненте html мы теперь можем перебирать этот компонент в нашем *ngFor:

<nz-collapse>
  <app-collapse-wrapper *ngFor = "let item of items">
    <div class = "item">
      <!-- some content here -->
    </div>
  </app-collapse-wrapper>
</nz-collapse>

Теперь у нас в основном есть один <ng-template> для каждого item, поэтому контекст не нужен.

Другие вопросы по теме