#33810·components

feat/bug(aria/accordion): 自定义触发点击

作者: mauriziocescon创建于 2026年9月15日更新于 2026年9月16日
标签featureneeds triagearea: aria/accordiongemini-triaged

@Component({ selector: '[myTrigger]', hostDirectives: [ { directive: AccordionTrigger, inputs: ['panel', 'disabled', 'expanded'], outputs: ['expandedChange'], }, ], // uncomment to make it working // host: { ngAccordionTrigger: '' }, template: <ng-content />, styles: :host { font-size: 16px; } , }) export class MyTrigger {}

@Component({ selector: 'CustomAccordion', imports: [ NgTemplateOutlet, AccordionGroup, AccordionTrigger, AccordionPanel, AccordionContent, ], template: <div ngAccordionGroup [multiExpandable]="false"> @if (trigger()) { <ng-container [ngTemplateOutlet]="trigger()" [ngTemplateOutletContext]="{ panel: panel, expanded: expanded(), expandedChange: () => expanded.update(v=> !v), disabled: disabled(), }" [ngTemplateOutletInjector]="'outlet'" /> } @else { <button ngAccordionTrigger [panel]="panel" [(expanded)]="expanded"> Click works! ✅ <span>Text inside span: working ✅</span> </button> } <div ngAccordionPanel #panel="ngAccordionPanel"> <ng-template ngAccordionContent> Content </ng-template> </div> </div> , }) export class CustomAccordion { readonly disabled = model(false); readonly expanded = model(false); readonly trigger = input<TemplateRef | undefined>(undefined); }

@Component({ selector: 'Consumer', imports: [MyTrigger, CustomAccordion], template: `


<CustomAccordion [trigger]="customTrigger" />

<ng-template
  #customTrigger
  let-panel="panel"
  let-disabled="disabled"
  let-expanded="expanded"
  let-expandedChange="expandedChange">

  <button
    myTrigger
    class="trigger"
    [panel]="panel"
    [disabled]="disabled"
    [expanded]="expanded"

内容来源: angular/components