我有一个ngb-carousel的实例,它当前的用法如下:

<ngb-carousel>
    <ng-template ngbSlide>Hello</ng-template>
    <ng-template ngbSlide>World</ng-template>
</ngb-carousel>

我想将它包装到我的定制 carousel 组件中,以提供一些额外的功能,以便这样使用它:

<!-- my-carousel.component.html -->
<div class="my-carousel">
    <ngb-carousel>
        <ng-content></ng-content>
    </ngb-carousel>
    <div>Some text here</div>
</my-carousel>

<!-- usage -->
<my-carousel>
    <ng-template ngbSlide>Hello</ng-template> 
    <ng-template ngbSlide>World</ng-template>
</my-carousel>

然而,这种天真的方法并不起作用,因为幻灯片没有被显示.

我试图使用<ng-content select="ng-template[ngbSlide]" ngProjectAs="ng-template[ngbSlide]">和其他组合,但都无济于事.

我遗漏了什么?哪种方式才是正确的呢?

推荐答案

  • 我们需要创建模板引用为slide的模板.

  • 然后我们可以拿ContentChildren分,通过内容投影获得所有幻灯片

  • 获得幻灯片后,关键是使用属性为ngbSlideng-template作为NGB-Carousel,以将其识别为幻灯片

  • 我们可以使用@for在幻灯片中循环,并使用ngTemplateOutletng-template中呈现它们

下面的工作示例

父html

@if (images) {
<my-carousel>
  <ng-template #slide>
    <div class="picsum-img-wrapper">
      <img [src]="images[0]" alt="Random first slide" />
    </div>
    <div class="carousel-caption">
      <h3>First slide label</h3>
      <p>Nulla vitae elit libero, a pharetra augue mollis interdum.</p>
    </div>
  </ng-template>
  <ng-template #slide>
    <div class="picsum-img-wrapper">
      <img [src]="images[1]" alt="Random second slide" />
    </div>
    <div class="carousel-caption">
      <h3>Second slide label</h3>
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
    </div>
  </ng-template>
  <ng-template #slide>
    <div class="picsum-img-wrapper">
      <img [src]="images[2]" alt="Random third slide" />
    </div>
    <div class="carousel-caption">
      <h3>Third slide label</h3>
      <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur.</p>
    </div>
  </ng-template>
</my-carousel>
}

父TS

import { Component } from '@angular/core';
import { NgbCarouselModule } from '@ng-bootstrap/ng-bootstrap';
import { MyCarouselComponent } from './my-carousel/my-carousel.component';

@Component({
  selector: 'ngbd-carousel-basic',
  standalone: true,
  imports: [NgbCarouselModule, MyCarouselComponent],
  templateUrl: './carousel-basic.html',
})
export class NgbdCarouselBasic {
  images = [944, 1011, 984].map((n) => `https://picsum.photos/id/${n}/900/500`);
}

我的 carousel

import { CommonModule } from '@angular/common';
import {
  Component,
  ContentChildren,
  OnInit,
  QueryList,
  TemplateRef,
} from '@angular/core';
import { NgbCarouselModule } from '@ng-bootstrap/ng-bootstrap';

@Component({
  selector: 'my-carousel',
  template: `
  <div class="my-carousel">
    <ngb-carousel>
      @for(slide of slides; track slide; let i = $index) {
      <ng-template ngbSlide >
        <ng-template
         [ngTemplateOutlet]="slide"></ng-template>
      </ng-template>
      }
    </ngb-carousel>
    <div>Some text here</div>
  </div>
  `,
  standalone: true,
  imports: [NgbCarouselModule, CommonModule],
})
export class MyCarouselComponent implements OnInit {
  @ContentChildren('slide', { read: TemplateRef }) slides: QueryList<
    TemplateRef<any>
  >;
  constructor() {}

  ngOnInit() {}

  ngAfterContentInit() {
    console.log(this.slides);
  }
}

stackblitz

Angular相关问答推荐

无法执行客户端功能Angular 17与ssr'

使用注入的主机组件进行指令测试

Angular 单元测试组件s @ Input.'变化值检测

Angular 客户端应用程序无法从停靠容器解析后端服务的地址

带逻辑的组件decorator 中的Angular 主机侦听器属性

如何防止打印后的空格后的HTML元素的Angular ?

当快速拖动光标时会丢失元素 - Angular

为什么初始化值为 1 的BehaviorSubject 不能分配给类型number?

在指令中获取宿主组件的templateRef

VSCode 调试器空白页面并在使用 VS Code 1.76.1 和 Chrome 111 启动时加载

iss 声明无效 Keycloak

如何有条件地更新 Angular 路由解析器数据?

等待两个订阅完成而不嵌套

Angular SPA 和 .Net 6 API 之间未连接 Application Insights Map

类型错误:无法读取未定义的属性

什么是 Angular 4,我可以从哪里了解更多信息?

Angular 2:formGroup 需要一个 FormGroup 实例

Angular @NGRX中这三个点的含义是什么

Angular 2 单元测试 - 出现错误无法加载ng:///DynamicTestModule/module.ngfactory.js

如何在 Angular CLI 的构建时插入内部版本号或时间戳