javascript - 如何将 ng-content 与 ng-container 一起使用?

标签 javascript angular

当我的组件位于 ng-container 中时,我无法显示它们。我有一个正在循环的项目数组,其中每个项目都有一个 bool 值,表示用户是否可以根据其访问权限看到该项目。由于我无法在一个元素上放置两个结构指令,因此我决定对 ngFor 使用 ng-container,然后将 ngIf 放置在组件上.

这是主要的侧面导航组件,显示侧面导航项目列表。

@Component({
  selector: 'side-nav',
  template: '<ng-content select="side-nav-item"></ng-content>'
})
export class SideNav { }

这是一个示例侧导航项(为此目的,除了显示 h2 之外什么也不做):

@Component({
  selector: 'side-nav-item',
  template: '<h2>Side Nav Item</h2>'
})
export class SideNavItem { }

这利用了上述两个组件

@Component({
  selector: 'main-nav',
  template: `
    <side-nav>
      <ng-container *ngFor="let item of sideNavItems">
        <side-nav-item *ngIf="item.hasAccess"></side-nav-item>
      </ng-container>
    </side-nav>

    <side-nav>
      <side-nav-item *ngFor="let item of sideNavItems"></side-nav-item>
    </side-nav>
  `
})
export class MainNav {
  sideNavItems: ISidNavItem[] = [
    {
      hasAccess: true, uri: '/dashboard'
    }
  ]
}

在此StackBlitz我希望看到打印两个组件,但我只得到最后一个,因为它不在 ng-container 内部。如何使用 ngForngIf 使其正常工作?

最佳答案

您可以在 MainNav 模板中使用 ngProjectAs

@Component({
  selector: 'main-nav',
  template: `
    <side-nav>
      <ng-container *ngFor="let item of sideNavItems" ngProjectAs="side-nav-item">
        <side-nav-item *ngIf="item.hasAccess"></side-nav-item>
      </ng-container>
    </side-nav>

    <side-nav>
      <side-nav-item *ngFor="let item of sideNavItems"></side-nav-item>
    </side-nav>
  `
})
export class MainNav {
  sideNavItems: ISidNavItem[] = [
    {
      hasAccess: true, uri: '/dashboard'
    }
  ]
}

这样,ng-contentselect 会将 ng-container 读取为 side-nav-item.

关于javascript - 如何将 ng-content 与 ng-container 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67591064/

相关文章:

javascript - 循环遍历 fetch() 调用列表

javascript - 滚动到没有名称的哈希

javascript - 如何获取未选中的复选框值。?有 Id 条件。?

javascript - 如何使用 Javascript 在 tbody 中的最后一个 tr 上添加行

Angular 6 使用两个共享模块 : Component is not a known element:

javascript - 整个页面作为拖放区

Angular ControlValueAccessor 和 markAsTouched

javascript - ng-sidebar(Angular 2)实现问题

html - 具有可扩展行的 Angular Material 表,在更改选项卡时自动扩展以 stackBlitz 示例

Angular 5 - 添加动态路由但不路由