TemplateRef не инициализируется

#javascript #angular

Вопрос:

У меня есть два компонента, над которыми я работаю, bu-breadcrumbs и bu-menu .

В bu-breadcrumbs , у меня есть панировочные сухари, которые создаются как:

 @Component({
  selector: 'bu-breadcrumbs',
  template: `
    <nav class="breadcrumb"
    [ngClass]="{
      'is-centered': alignment === 'centered',
      'is-right': alignment === 'right',
      'has-arrow-separator': separator === 'arrow',
      'has-bullet-separator': separator === 'bullet',
      'has-dot-separator': separator === 'dot',
      'has-succeeds-separator': separator === 'succeeds',
      'is-small': size === 'small',
      'is-medium': size === 'medium',
      'is-large': size === 'large'
    }"
    [attr.aria-label]="ariaLabel">
      <ul>
        <li *ngFor="let breadcrumb of breadcrumbs; let idx = index"
          [ngClass]="{ 'is-active': idx === breadcrumbs.length - 1 }">
          <ng-container *ngTemplateOutlet="breadcrumb.templateRef"></ng-container>
        </li>
      </ul>
    </nav>
  `
})
export class BulmaBreadcrumbsComponent {
  @Input('label') ariaLabel = '';
  @Input('alignment') alignment = '';
  @Input('separator') separator = '';
  @Input('size') size = '';

  @ContentChildren(BulmaBreadcrumbComponent) breadcrumbs!: QueryList<BulmaBreadcrumbComponent>;

  constructor() {}
}

@Component({
  selector: 'bu-breadcrumb',
  template: `
    <ng-template>
      <ng-content></ng-content>
    </ng-template>
  `
})
export class BulmaBreadcrumbComponent implements AfterContentInit {
  @ViewChild(TemplateRef) templateRef!: TemplateRef<any>;

  constructor(private readonly cdr: ChangeDetectorRef) {}

  public ngAfterContentInit() {
    this.cdr.detectChanges();
  }
}
 

Это создает компонент так, как я ожидаю, что он должен:
Ожидаемая панировочная крошка

Теперь я пытаюсь использовать ту же технику для реализации своего bu-menu компонента, но шаблон создается неправильно. В настоящее время код является:

 @Component({
  selector: 'bu-menu-list-item',
  template: `
    <ng-template>
      <ng-content></ng-content>
    </ng-template>
  `
})
export class BulmaMenuListItemComponent implements AfterContentInit {
  @ViewChild(TemplateRef) public templateRef!: TemplateRef<any>;

  constructor(private readonly cdr: ChangeDetectorRef) {
    console.log('constructed')
  }

  public ngAfterContentInit() {
    this.cdr.detectChanges();
  }
}

@Component({
  selector: 'bu-menu-list',
  template: `
    <ul class="menu-list">
      <li *ngFor="let menuItem of menuItems; let idx = index">
        <ng-container *ngTemplateOutlet="menuItem.templateRef"></ng-container>
      </li>
    </ul>
  `,
})
export class BulmaMenuListComponent {
  @ContentChildren(BulmaMenuListItemComponent) public menuItems!: QueryList<BulmaMenuListItemComponent>;

  constructor() {}
}
 
 <bu-menu>
  <bu-menu-label>General</bu-menu-label>
  <bu-menu-list>
    <a>Dashboard</a>
    <a>Customers</a>
  </bu-menu-list>
  <bu-menu-label>Administration</bu-menu-label>
  <bu-menu-list>
    <a>Team Settings</a>
    <a class="is-active">Manage Your Team</a>
    <ul>
      <li><a>Members</a></li>
      <li><a>Plugins</a></li>
      <li><a>Add a member</a></li>
    </ul>
    <a>Invitations</a>
    <a>Cloud Storage Environment Settings</a>
    <a>Authentication</a>
  </bu-menu-list>
  <bu-menu-label>Transactions</bu-menu-label>
  <bu-menu-list>
    <a>Payments</a>
    <a>Transfers</a>
    <a>Balance</a>
  </bu-menu-list>
</bu-menu>

 

My expectation is that the bu-menu should create a menu that looks like:

Ожидается меню Bulma

Но мой текущий код, похоже, неправильно загружает шаблон для повторения <li> элементов:

Текущее меню Bulma

Я в тупике относительно того, где я ошибаюсь в реализации (я бы сказал) той же концепции для этого компонента.

Комментарии:

1. Не могли бы вы, пожалуйста, создать stackblitz.com пример

2. Ваше имя селектора-пункт списка bu-меню,и вы используете bu-меню @JosephQuinn

3. @GetOffMyLawn stackblitz.com/edit/angular-ivy-lwr8ds?file=src/app/menu/…

4. @GaurangDhorda это не объясняет, почему он работает в компоненте панировочных сухарей, а не в компоненте меню.