ng-template和ng-container及利用ngTemplateOutlet遍历树形结构数据

ng-container

ng-container 是angular 定义的一个特殊的语义化标签
可以把它理解为一个容器,可以直接包裹任何一个元素,但本身不会生成元素化标签,也不会影响页面布局和样式

ng-container 经常用来配合ngif和ngfor进行使用
<div [ngStyle]="{'background-color':'yellow'}">
  <ng-container *ngFor="let data of valueData">
    <div>{{data}}</div>
  </ng-container>
</div>

ng-template

ng-template 是angular结构性指令的一种,用于定义模板渲染加载html,
定义了一个默认不渲染的模板,需要其他结构性指令如ngif或tempate-ref将模块内容渲染到页面中

<ng-container *ngIf="status else NoStatus">
  status 为true
</ng-container>
<ng-template #NoStatus>
  status为false
</ng-template>

可以通过ng-container中的templateOutlet指令动态加载ng-template模板

<ng-template #login>
  login
</ng-template>
<ng-template #index>
  index
</ng-template>
<ng-container *ngTemplateOutlet="login"></ng-container>
<ng-container [ngTemplateOutlet]="index"></ng-container>

ngTemplateOutletContext

可以通过ngTemplateOutletContext属性传递数据给ngTemplateOutlet
使用模板输入变量let的形式,接收上下文属性值

<ng-template let-value="value" #testContext>
  {{value}}
</ng-template>
<!--不简写的写法-->
<ng-container [ngTemplateOutlet]="testContext" [ngTemplateOutletContext]="{value:testContextString}">
</ng-container>
testContextString='这是一段测试ngTemplateOutLetContext的内容'

ngTemplateOutletContext可以缩写
$implicit 是默认值,在let-value后面没有=时,value会引用它

<!--简写的写法-->
此时data用的时context 中传入的默认值
<ng-template let-data>
  {{data}}
</ng-template>
<ng-container *ngTemplateOutlet="testContext context:{$implicit:'默认引用值',value:testContextString}">
</ng-container>

遍历树形结构数据

利用ng-template和ng-container 以及ngTemplateOutlet 进行dom递归生成树结构

<ng-container *ngTemplateOutlet="nodeTreeDisplay context:{$implicit:tree,level:0}"></ng-container>

<ng-template #nodeTreeDisplay let-nodes let-level='level'>
  <ng-container *ngFor="let item of nodes;">
    <div [style]="{'margin-left':level * 10 + 'px'}">
      {{item.text}}
    </div>
    <!--寻找树的子节点-->
    <ng-container *ngIf="item.children">
      <ng-container *ngTemplateOutlet="nodeTreeDisplay context:{$implicit:item.children,level:level +1 }">
      </ng-container>
    </ng-container>
  </ng-container>
</ng-template>

树结构数据

type TreeNode ={
  text:string,
  children?:TreeNode[]
}

tree: TreeNode[] = [
    {
      text: '父节点1',
      children: [
        {
          text: '子节点a',
          children: [
            {
              text: '子节点b',
            },
            {
              text: '子节点c',
            },
          ],
        }
      ],
    },
    {
      text: '父节点2',
      children: [
        {
          text: '子节点d',
          children: [
            {
              text: '子节点e',
            },
          ],
        },
      ],
    },
    {
      text: '父节点3',
    },
  ];
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值