nz-timeline 动态显示icon

2018-12-11  本文已影响0人  4f4e62418dff

我们先介绍一下nz-timeline的基本用法。
使用nz-timeline控件的时候发现一个问题,如果要使用自定义的icon,必须用ng-template的方式。
比如

<nz-timeline>
      <nz-timeline-item>Create a services site 2015-09-01</nz-timeline-item>
      <nz-timeline-item>Solve initial network problems 2015-09-01</nz-timeline-item>
      <nz-timeline-item nzColor="red" [nzDot]="dotTemplate">Technical testing 2015-09-01</nz-timeline-item>
      <nz-timeline-item>Network problems being solved 2015-09-01</nz-timeline-item>
    </nz-timeline>
    <ng-template #dotTemplate>
      <i nz-icon type="clock-circle-o" style="font-size: 16px;"></i>
    </ng-template>

既然是动态显示icon,那么界面上显示的信息肯定是动态的。我们用一个*ngFor来处理。
ts文件里

items=[
{name:"1"}
{name:"2"}
{name:"3"}
{name:"4"}
..........
]

html文件:

<nz-timeline>
    <ng-container *ngFor="let item of items">
      <nz-timeline-item [nzDot]="dotTemplate">{{item.name}}</nz-timeline-item>
   </ng-container>     
</nz-timeline>
<ng-template #dotTemplate>
      <i nz-icon type="clock-circle-o" style="font-size: 16px;"></i>
    </ng-template>

ngSwitch方法

ts文件里

items=[
{name:"1",icon:"icon-1"}
{name:"2",icon:"icon-2"}
{name:"3",icon:"icon-3"}
{name:"4",icon:"icon-1"}
..........
]

html文件:

<nz-timeline>
    <ng-container *ngFor="let item of items">
      <ng-container [ngSwitch]="item.icon">
        <ng-container *ngSwitchCase="'icon-1'">
          <nz-timeline-item [nzDot]="icon_1_temp">{{item.name}}</nz-timeline-item>
        </ng-container>
        <ng-container *ngSwitchCase="'icon-2'">
          <nz-timeline-item [nzDot]="icon_2_temp">{{item.name}}</nz-timeline-item>
        </ng-container>
        <ng-container *ngSwitchCase="'icon-3'">
          <nz-timeline-item [nzDot]="icon_3_temp">{{item.name}}</nz-timeline-item>
        </ng-container>
      </ng-container>
   </ng-container>     
</nz-timeline>
    <ng-template #icon_1_temp>
      <i nz-icon type="clock-circle-1" style="font-size: 16px;"></i>
    </ng-template>
  <ng-template #icon_2_temp>
      <i nz-icon type="clock-circle-2" style="font-size: 16px;"></i>
    </ng-template>
  <ng-template #icon_3_temp>
      <i nz-icon type="clock-circle-3" style="font-size: 16px;"></i>
    </ng-template>

这个时候,虽然只有三种icon的情况,但是代码已经很膨胀了。
不过既然能解决问题,也能很好的读懂代码,也是很不错的解决方法。

这时候需求又变了,产品经理要求增加一个字段,根据不同的type显示不同的颜色。

items=[
{name:"1",icon:"icon-1",type:"1"}
{name:"2",icon:"icon-2",type:"2"}
{name:"3",icon:"icon-3",type:"3"}
{name:"4",icon:"icon-1",type:"1"}
..........
]

再加一层ngSwitch。。。。那代码量一下扩大了n被,以后要是改样式那就很痛苦了。。。。。
我们需要换个思路来决绝。

templateRef方法

ts文件:

@ViewChild("icon_1_temp")  icon1Temp:TemplateRef<any>
@ViewChild("icon_2_temp")  icon2Temp:TemplateRef<any>
@ViewChild("icon_3_temp")  icon3Temp:TemplateRef<any>
convertItems(items){
  items.map(item=>{ 
    if(item.icon=="icon-1"){
      item.temp = this.icon1Temp;
    }else if(item.icon=="icon-2"){
      item.temp = this.icon2Temp;
    }else if(item.icon=="icon-3"){
      item.temp = this.icon3Temp;
    }
    if(item.type=="1"){
      item.color=color1;
    }else if(item.icon=="icon-2"){
      item.color= color2;
    }else if(item.icon=="icon-3"){
      item.color= color3;
    }
  })
}

html文件:

<nz-timeline>
    <ng-container *ngFor="let item of items">
      <nz-timeline-item  [nzDot]="item.temp" [nzColor]="item.color">{{item.name}}</nz-timeline-item>
   </ng-container>     
</nz-timeline>
    <ng-template #icon_1_temp>
      <i nz-icon type="clock-circle-1" style="font-size: 16px;"></i>
    </ng-template>
  <ng-template #icon_2_temp>
      <i nz-icon type="clock-circle-2" style="font-size: 16px;"></i>
    </ng-template>
  <ng-template #icon_3_temp>
      <i nz-icon type="clock-circle-3" style="font-size: 16px;"></i>
    </ng-template>

在获取到数据后,执行一下convertItems方法,就能正常显示了。
这样我们就完成了icon的动态显示。

上一篇下一篇

猜你喜欢

热点阅读