Angular ng-zorro-antd 使用nz-table,更改数据不渲染的问题

最近在工作中使用angular,组件库使用ng-zorro-antd,边学边用。在写表格组件的时候发现,点击新增、删除就,数据改变,表格却没有更新。

代码如下:

<a (click)="addRow(item)">新增一列</a>
<nz-table
  #basicTable
  class="form-table"
  [nzBordered]="true"
  [nzData]="fields"
  [nzShowPagination]="false">
  <thead>
    <tr>
      <th>值的编号</th>
      <th>字段</th>
      <th>操作</th>
    </tr>
  </thead>
  <tbody cdkDropList (cdkDropListDropped)="drop($event, fields)">
    <!-- <tr *ngFor="let data of fields, let i = index" cdkDrag> -->
    <tr *ngFor="let data of basicTable.data, let i = index" cdkDrag>
      <td>值{{ i + 1 }}</td>
      <td>{{ data.fields }}</td>
      <td>
        <a (click)="deleteRow(item, i, index, data.$sortOperation)">删除</a>
      </td>
    </tr>
  </tbody>
</nz-table>

对表格行数据遍历有2种写法,如下:

// 写法1
<tr *ngFor="let data of fields, let i = index" cdkDrag>

// 写法2
<tr *ngFor="let data of basicTable.data, let i = index" cdkDrag>
如果采用写法1

写法是官网示例的写法之一
点击新增时,数据push进去了,但是表格没有新增一条

addRow(item) {
    item.fields.push({
        ...cloneDeep(fieldsGroup),
        add_id: addId,
    });
}

但使用如下写法,点击新增时,数据push进去了,但是表格没有成功显示新增

addRow(item) {
    item.fields = [
        ...item.groupByFields,
        {
          ...cloneDeep(fieldsGroup),
          add_id: addId,
        },
    ];
}

同理删除的时候也是如此:
点击删除按钮的时候,使用splice删除一行,该数据已经删除,但表格页面数据没有消失

  deleteRow(item, index, tableIndex, sortOperation) {
    item.fields.splice(index, 1);
  }

但是如果使用filter,将过滤后的结果重新赋值,表格成功删除一条

  deleteRow(item, index, tableIndex, sortOperation) {
    item.fields = item.fields.filter(item => item.$sortOperation !== sortOperation);
  }

另外,如果只用表格拖拽功能时,写法1也不能成功拖拽表格顺序。

如果采用写法2

如果采用写法2,上面的2中写法都可以实现效果。

分析

查找ng-zorro-antd源码,发现其中是这么写的:当nzData发生变化的时候重新渲染。

  ngOnChanges(changes: SimpleChanges): void {
    if (nzData) {
      this.nzData = this.nzData || [];
      this.nzTableDataService.updateListOfData(this.nzData);
    }
  }

查找发现

当Angular检查组件的输入属性以进行更改时,它(基本上)===使用脏检查。对于数组,这意味着对数组引用(仅)进行脏检查。由于引用没有改变,ngOnChanges()因此不会被调用。
OnChanges只对输入的基本数据类型起作用,而引用数据类型不会触发OnChanges方法。

当使用写法1的时候,由于是引用数据类型,对表格行数据进行操作,不会触发OnChanges方法,是不会触发表格组件的重新渲染的,但是重新赋值改变了nzData的引用,会触发OnChanges方法。

ng-zorro-antd官网使用写法1是因为其数据结构简单,这个问题就不会出现。在自己的工作中,数据层级多,问题出现。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容