Angular ng-zorro-antd 使用nz-table,更改數(shù)據(jù)不渲染的問題

最近在工作中使用angular,組件庫使用ng-zorro-antd,邊學(xué)邊用。在寫表格組件的時(shí)候發(fā)現(xiàn),點(diǎn)擊新增、刪除就,數(shù)據(jù)改變,表格卻沒有更新。

代碼如下:

<a (click)="addRow(item)">新增一列</a>
<nz-table
  #basicTable
  class="form-table"
  [nzBordered]="true"
  [nzData]="fields"
  [nzShowPagination]="false">
  <thead>
    <tr>
      <th>值的編號(hào)</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>

對(duì)表格行數(shù)據(jù)遍歷有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

寫法是官網(wǎng)示例的寫法之一
點(diǎn)擊新增時(shí),數(shù)據(jù)push進(jìn)去了,但是表格沒有新增一條

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

但使用如下寫法,點(diǎn)擊新增時(shí),數(shù)據(jù)push進(jìn)去了,但是表格沒有成功顯示新增

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

同理刪除的時(shí)候也是如此:
點(diǎn)擊刪除按鈕的時(shí)候,使用splice刪除一行,該數(shù)據(jù)已經(jīng)刪除,但表格頁面數(shù)據(jù)沒有消失

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

但是如果使用filter,將過濾后的結(jié)果重新賦值,表格成功刪除一條

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

另外,如果只用表格拖拽功能時(shí),寫法1也不能成功拖拽表格順序。

如果采用寫法2

如果采用寫法2,上面的2中寫法都可以實(shí)現(xiàn)效果。

分析

查找ng-zorro-antd源碼,發(fā)現(xiàn)其中是這么寫的:當(dāng)nzData發(fā)生變化的時(shí)候重新渲染。

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

查找發(fā)現(xiàn)

當(dāng)Angular檢查組件的輸入屬性以進(jìn)行更改時(shí),它(基本上)===使用臟檢查。對(duì)于數(shù)組,這意味著對(duì)數(shù)組引用(僅)進(jìn)行臟檢查。由于引用沒有改變,ngOnChanges()因此不會(huì)被調(diào)用。
OnChanges只對(duì)輸入的基本數(shù)據(jù)類型起作用,而引用數(shù)據(jù)類型不會(huì)觸發(fā)OnChanges方法。

當(dāng)使用寫法1的時(shí)候,由于是引用數(shù)據(jù)類型,對(duì)表格行數(shù)據(jù)進(jìn)行操作,不會(huì)觸發(fā)OnChanges方法,是不會(huì)觸發(fā)表格組件的重新渲染的,但是重新賦值改變了nzData的引用,會(huì)觸發(fā)OnChanges方法。

ng-zorro-antd官網(wǎng)使用寫法1是因?yàn)槠鋽?shù)據(jù)結(jié)構(gòu)簡單,這個(gè)問題就不會(huì)出現(xiàn)。在自己的工作中,數(shù)據(jù)層級(jí)多,問題出現(xiàn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 從計(jì)劃2.0開始足足進(jìn)行近四個(gè)月,其中發(fā)布過八個(gè)版本。當(dāng)初給2.0做的愿景基本上達(dá)到要求,當(dāng)然一切都還是那句話:【...
    cipchk閱讀 877評(píng)論 1 0
  • 首先,不得不說 @delon 是一個(gè)很不錯(cuò)的業(yè)務(wù)組件,它是 ng-alain 默認(rèn)使用的業(yè)務(wù)組件! 但是由于 de...
    Tucke閱讀 6,750評(píng)論 0 51
  • Angular2.0 —構(gòu)建項(xiàng)目的流程以及使用ng-zorro ng-zorroy官網(wǎng):https://ng.an...
    殺個(gè)程序猿祭天閱讀 1,633評(píng)論 0 1
  • 久違的晴天,家長會(huì)。 家長大會(huì)開好到教室時(shí),離放學(xué)已經(jīng)沒多少時(shí)間了。班主任說已經(jīng)安排了三個(gè)家長分享經(jīng)驗(yàn)。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,789評(píng)論 16 22
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄。 中午開了第一次的黨會(huì),身份的轉(zhuǎn)變要...
    余生動(dòng)聽閱讀 10,798評(píng)論 0 11

友情鏈接更多精彩內(nèi)容