Передача контекста в 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
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
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, поэтому контекст не нужен.

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