ng-zorro-ant中关于angular实现的面包屑源码解读

想要分析ng-zorro-ant的面包屑源码,首先要先了解ng-content

 1.ng-zorro-ant 的官网https://ng.ant.design/version/0.7.x/components/breadcrumb/zh

1.ng-content

   这部分大家可以搜索一下ng-content,有更好的博主做了总结,在这里我只简单的介绍一下它的用途。

   此用法可以接受外部投射进来的内容

  1.外部引入组件

<demo-component>
    开始,我是外部嵌入的内容,
    <header>
       header
    </header>
    <div class="footer">
       footer
    </div>
    <div name="left">
       left
    </div>
    结束
</demo-component>

   2.组件内容

       扩展一下select 属性,可以让你在特定的地方投射具体的内容.如上所示,header对应标签选择器,类选择器和属性选择器都如下所示,会将内容展示到对应的地方。

<div >
    <h2>
       我是人
    </h2>
    <div style="color:red">
        <ng-content></ng-content>
    </div>
    <div>
        <ng-content select="header"></ng-content>
    </div>
    <div>
        <ng-content select=".footer"></ng-content>
    </div>
    <div >
        <ng-content select="[name=left]"></ng-content>
    </div>
</div>

 2 .面包屑组件

   ng-alain的面包屑组件是分两个组件实现的

<nz-breadcrumb>
      <nz-breadcrumb-item>
        Home
      </nz-breadcrumb-item>
 </nz-breadcrumb>

 1.nz-breadcrumb的源代码

<ng-content></ng-content>
<ng-container *ngIf="nzAutoGenerate">
  <nz-breadcrumb-item *ngFor="let breadcrumb of breadcrumbs">
    <!-- We do not simply use routerLink here to avoid importing RouterModule to BreadcrumbModule. -->
    <a [attr.href]="breadcrumb.url" (click)="navigate(breadcrumb.url, $event)">{{ breadcrumb.label }}</a>
  </nz-breadcrumb-item>
</ng-container>

2.nz-breadcrumb-item的源代码

<span class="ant-breadcrumb-link">
      <ng-content></ng-content>
    </span>
    <span class="ant-breadcrumb-separator">
      <ng-container *ngIf="nzBreadCrumbComponent.isTemplateRef; else stringTemplate">
        <ng-template [ngTemplateOutlet]="nzBreadCrumbComponent.nzSeparator"></ng-template>
      </ng-container>
      <ng-template #stringTemplate>
         {{ nzBreadCrumbComponent.nzSeparator }}
      </ng-template>
 </span>

3.官网上的实现

  Home / Application List / An Application

因为nzAutoGenerate默认是false的,所以可以得知,当nzAutoGenerate变量设为false时,组件的模板投射是通过ng-content实现的。

nzSeparator 默认是/,可以设置string | TemplateRef<void>,此处代码可以具体去看官网源代码。

此处谈谈ng-container和ngTemplateOutlet两个属性

4.ng-container

 是一个逻辑容器,可用于对节点进行分组,但不作为 DOM 树中的节点,它将被渲染为 HTML中的 comment 元素,它可用于避免添加额外的元素来使用结构指令

5.ngTemplateOutlet 

 ngTemplateOutlet 是一个指令,它接收模板变量,可以实现模板的动态渲染。因此当nzSeparator是TemplateRef时,会将

isTemplateRef设置为true,ngTemplateOutlet 会将TemplateRef动态展示出来。

 同样的,因为ngTemplateOutlet 的动态创建模板的方法,也经常用来代替ng-content,因为ng-content只是用来展示的,组件只被实例化了一次 - 从未被销毁和重新创建,如果用*ngIf来判断显示,并不会被初始化第二次,但我们用ngTemplateOutlet可以解决这个问题,此处用面包屑组件举一个例子。

<nz-breadcrumb>
 <ng-template>
      <nz-breadcrumb-item>
       
      </nz-breadcrumb-item>
    </ng-template>
 </nz-breadcrumb>

nz-breadcrumb组件里用以下代替ng-content,template是动态传进来的模板
<div class="content" *ngIf="show">
        <ng-container [ngTemplateOutlet]="template"></ng-container>
</div>

注意,接收template的方法为
@ContentChild(TemplateRef) template: TemplateRef;

 

6.最后

  当nzAutoGenerate为true的方法大家可以去看看源码,这一部分是利用路由自动实现的方法,对于路由存储这块我还不太熟,先不做介绍了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值