• 解决angular11+zorro使用table组件排序失效以及分页组件失效问题,附完整DEMO代码


    关于这个排序失效问题的核心点,跟这个有关系:[nzFrontPagination]="false"

    关于分页组件失效的问题,是你获取数据以后,需要给页码,页数,总条数都要重新赋值,这个真的是好无语

    要考虑清楚,你是前端分页还是后端分页,如果是前端分页,代码可以参考官方zorro文档,里边很多,如果你是后端分页,那么可以参考下面的DEMO

    首先新建 一个组件,在路由里和模块里都注册一下,注册路由你自己根据需求来,

    • 备注:如果不注册到当前模块,某些zorro的组件是无法使用的,会报错,这个是angular11版本和其他版本的不同之处。。。不再赘述了

    来,上DEMO

    html

    <p>my-test01 works!</p>
    <div class="bottom_table">
      <nz-table #filterTable [nzData]="listOfData" nzTableLayout="fixed" [nzShowPagination]="false"
        [nzFrontPagination]="false" [nzScroll]="{ x: '1200px', y: '570px' }">
        <thead>
          <tr>
            <th *ngFor="let column of listOfColumns" [nzSortFn]="column.sortFn" [nzWidth]="column.w"
              (nzSortOrderChange)="sortChange($event,column.key)">
              {{ column.name }}
            </th>
          </tr>
        </thead>
        <tbody>
          <tr *ngFor="let data of filterTable.data">
            <td>{{ data.item01 }}</td>
            <td>{{ data.item02 }}</td>
            <td>{{ data.item03 }}</td>
            <td>{{ data.item04 }}</td>
            <td>{{ data.item05 }}</td>
            <td>{{ data.item06 }}</td>
          </tr>
        </tbody>
      </nz-table>
      <div class="my_page">
        <div class="pagination_css">
          <ng-template #totalTemplate let-total>共{{ total }}條</ng-template>
          <nz-pagination  [(nzPageSize)]="page.pageSize" [(nzPageIndex)]="page.current" [nzTotal]="page.total"
             [nzSize]="'small'" nzShowSizeChanger   
            nzShowQuickJumper [nzShowTotal]="totalTemplate" (nzPageIndexChange)="currentChange($event)"
            (nzPageSizeChange)="pageSizeChange($event)"></nz-pagination>
        </div>
      </div>
    </div>
    

    ts

    import { Component, OnInit } from '@angular/core';
    import { NzMessageService } from 'ng-zorro-antd/message';
    import { _HttpClient } from '@delon/theme';
    interface DataItem {
      item01: number;
      item02: number;
      item03: string;
      item04: string;
      item05: string;
      item06: string;
    }
    interface ColumnItem {
      name: string;
      w: string;
      key: string,
      sortFn: boolean,
    }
    @Component({
      selector: 'app-my-test01',
      templateUrl: './my-test01.component.html',
      styleUrls: ['./my-test01.component.less']
    })
    
    export class MyTest01Component implements OnInit {
    
      constructor(
    
        private msgSrv: NzMessageService,
        public http: _HttpClient,
      ) { }
    
      ngOnInit(): void {
        this.setData()
      }
    
      // 分頁代碼
      page = {
        current: 1,
        total: 0,
        pageSize: 10
    
      }
      totalTemplate = true
      // 分頁代碼
      // 表格代碼----start
      listOfColumns: ColumnItem[] = [
        {
          name: '序號',
          key: 'item01',
          sortFn: false,
          w: '4%',
        },
        {
          name: '第二列',
          key: 'item02',
          sortFn: true,
          w: '4%',
        },
        {
          name: '第三列',
          key: 'item03',
          sortFn: true,
          w: '5%',
        },
        {
          name: '第四列',
          key: 'item04',
          sortFn: true,
          w: '4%',
        },
        {
          name: '第五列',
          key: 'item05',
          sortFn: true,
          w: '4%',
        },
        {
          name: '第六列',
          key: 'item06',
          sortFn: true,
          w: '12%',
        },
      ];
      listOfData: DataItem[] = [
        {
          item01: 1,
          item02: 0.01,
          item03: '1',
          item04: '1',
          item05: '1',
          item06: '1',
        },
    
      ];
      setData() {
        this.listOfData = new Array(500).fill({}).map((_, i) => {
          return {
            item01: i + 1,
            item02: 0.01 * (i + 1),
            item03: i + 10 + '數據',
            item04: i + 100 + '數據',
            item05: i + 1000 + '數據',
            item06: i + 10000 + '數據',
          }
        })
        this.page.total = this.listOfData.length
      }
      sortChange(e, name) {
        console.log(e, name)
        this.listOfData = e === 'ascend' ? this.listOfData.sort(
          (a, b) => (typeof (a[name]) === 'string') ? a[name].localeCompare(b[name]) : a[name] - b[name]) : this.listOfData.sort(
            (a, b) => (typeof (a[name]) === 'string') ? b[name].localeCompare(a[name]) : b[name] - a[name]
          )
      }
      currentChange(e) {
        this.page.current = e
        console.log('頁碼this.page.current:', this.page.current)
        const params = {
          cur_page: this.page.current,
          page_size: this.page.pageSize,
        }
        this.getTable(params)
      }
      pageSizeChange(e) {
        this.page.pageSize = e
        console.log('頁碼this.page.pageSize:', this.page.pageSize)
        const params = {
          cur_page: 1,
          page_size: this.page.pageSize,
        }
        this.getTable(params)
      }
      baseUrl = ''
      async getTable(params) {
        // const res4: any = await this.myHttpRes('post', this.baseUrl + '/testData', params, false);
        // if (res4 && res4.success) {
        //   this.msgSrv.success(res4.msg ? res4.msg : 'Get Data Success!')
        //   this.listOfData = res4.data.tableData
        //   this.page.total = res4.data.total
        //   console.log(this.listOfData)
        // } else {
        //   this.msgSrv.error(res4 && res4.msg ? res4.msg : 'Get Table Data Fail!')
        // }
    
        // 模擬數據
        console.log('第几頁:',params.cur_page)
        console.log('每頁條數:',params.page_size)
        let newArr = []
        newArr = new Array(params.page_size).fill({}).map((_, i) => _ = {
          item01: i + 1 + (params.cur_page - 1) * 10,
          item02: 0.01 * (i + 1),
          item03: i + 10 + '數據',
          item04: i + 100 + '數據',
          item05: i + 1000 + '數據',
          item06: i + 10000 + '數據',
        })
        this.listOfData = newArr
        this.page.current = params.cur_page // 解決奇葩的問題
        this.page.pageSize = params.page_size // 解決奇葩的問題
        this.page.total = 500
      }
    
      // 下面都是工具函數-----------分割線----------------------分割線-----------
    
      async myHttpRes(method: string, url: string, formData: object = {}, needMsg, msgScu = 'Success!', msgErr = 'Network Error!'): Promise<Node[]> {
        return new Promise<Node[]>((resolve: any, reject: any) => {
          // this.http[method](url, formData).pipe(timeout(12000)).subscribe(
          this.http[method](url, formData).subscribe(
            {
              next: (res: any) => {
                if (res && (['success', 'OK'].indexOf(res.status) !== -1 || res.success || [0].indexOf(res.errorNum) !== -1 || ['1', '0', '000000', '001', '002'].indexOf(res.code) !== -1)) {
                  needMsg && this.msgSrv.success(res.message || msgScu)
                  resolve(res)
                  // resolve(res)
                } else {
                  needMsg && this.myAlert(res.message || msgErr)
                  // 操作失敗,請檢查網絡重試...
                  reject(new Error(res.message || msgErr))
                }
              },
              error: (err: any) => {
                // console.log('走這裡了123',err)
                needMsg && this.myAlert(msgErr)
                reject(new Error(err.message || 'Error'))
              }
            })
        })
      }
      // 因需求增加提示框,樣式需要增加到容易修改的地方
      myAlert(name) {
        var myAlertBigBoxIsTrue = document.getElementById('myMLBAlertBigBox');
        // console.log(myAlertBigBoxIsTrue);
        if (myAlertBigBoxIsTrue === null) {
    
          // 創建一個遮罩層
          var bigbox = document.createElement("div");
          bigbox.id = "myMLBAlertBigBox";
          //创建一个大盒子
          var box = document.createElement("div");
          var myspan = document.createElement('span');
          //创建一个关闭按钮
          var button = document.createElement("button");
    
          bigbox.appendChild(box);
          // 設置遮罩層的樣式
          var bigboxName = {
            "width": "100%",
            "height": "100vh",
            "background-color": "rgba(0,0,0,0.4)",
            "position": "fixed",
            "top": "0",
            "left": "0",
            "z-index": "1000",
            "text-align": "center"
          }
          //给元素添加元素
          for (var k in bigboxName) {
            bigbox.style[k] = bigboxName[k];
          }
          //定义一个对象保存样式
          var boxName = {
             "500px",
            height: "180px",
            backgroundColor: "white",
            border: "1px solid rgb(226,222,222)",
            position: "absolute",
            "box-shadow": "5px 5px 10px 2px rgba(0,0,0,0.4)",
            top: "20%",
            "border-radius": "5px",
            left: "50%",
            margin: "-90px 0 0 -250px",
            zIndex: "1001",
            textAlign: "center",
            lineHeight: "180px"
          }
          //给元素添加元素
          for (var k in boxName) {
            box.style[k] = boxName[k];
          }
          //把创建的元素添加到body中
          document.body.appendChild(bigbox);
          //把alert传入的内容添加到box中
          if (arguments[0]) {
            // box.innerHTML = arguments[0];
            myspan.innerHTML = arguments[0];
          }
          // 定義span樣式
          var spanName = {
            "text-align": "left",
            "line-height": "30px",
            "border-radius": "5px",
            "outline": "none",
            "word-break": "break-all",
            "position": "absolute",
            "overflow-y": "auto",
            "overflow": "auto",
            "height": "112px",
            "top": "20px",
            "right": "25px",
            "left": "25px",
    
          }
          for (var j in spanName) {
            myspan.style[j] = spanName[j];
          }
    
          // bigbox.appendChild(box);
          box.appendChild(myspan);
          button.innerHTML = '關閉'// 改為I18N
          // button.innerHTML = this.fanyi('button.close');
          //定义按钮样式
          var btnName = {
            border: "1px solid #ccc",
            backgroundColor: "#fff",
             "70px",
            height: "30px",
            textAlign: "center",
            lineHeight: "27px",
            "border-radius": "5px",
            outline: "none",
            position: "absolute",
            bottom: "10px",
            right: "20px",
    
          }
          for (var j in btnName) {
            button.style[j] = btnName[j];
          }
          //把按钮添加到box中
          box.appendChild(button);
          //给按钮添加单击事件
          button.addEventListener("click", function () {
            bigbox.style.display = "none";
            var idObject = document.getElementById('myMLBAlertBigBox');
            if (idObject != null)
              idObject.parentNode.removeChild(idObject);
          })
        } else {
          return;
        }
      }
      // 因需求增加提示框,樣式需要增加到容易修改的地方
    }
    
    

  • 相关阅读:
    移动端常用状态
    css 动画
    jQuery源码解析 -- 概述
    Bearer Token && JWT --- 深入理解令牌机制
    字符串 ----> switch-case 语句
    Vuejs选项: provide/inject
    本地windows系统-》windows云服务器文件上传
    CSS基础点
    函数的调用 与 this
    两个有意思的网站
  • 原文地址:https://www.cnblogs.com/sugartang/p/15408055.html
Copyright © 2020-2023  润新知