首页 > 其他分享 >基于ng-zorro table滚动无限加载

基于ng-zorro table滚动无限加载

时间:2023-06-11 21:12:58浏览次数:54  
标签:index end Column zorro ng address table data

首先复制一下ng-zorro的虚拟表格

这里选用虚拟表格,原因是数据页面有多个表格存在加载的数据量很大,且表格滚动时有事件监听不用写额外的方法去监听滚动条滚动

 先打印分析表格滚动时有哪些信息被输出

从打印的信息内发现有个_renderedRange属性名为渲染的范围,因此可以通过该属性的end值来判断当前表格已经滚动到底部,因此我们先获取下_renderedRange的end值

但是打印时发现_renderedRange为私有属性无法直接获取

 这里我们先用//@ts-ignore忽略下语法检查

 滚动到底部正常打印100(当前只有100条数据)

 但用//@ts-ignore这种方法是不可取的,因此我们点进cdkVirtualScrollViewport看看有没有方法返回了_renderedRange的值

因为angular内部源码基本都是面向对象的编程,因此可以尝试搜索下getrenderedRang

 因此_renderedRange值可以通过getRenderedRange()方法来获取end值

 

 正常获取end值 ,此时可以通过判断end值是否等于当前数据集合长度来加载数据

效果

优化下在表格最下方加入加载的标志提醒用户在加载

 效果

 当然还有后端已经查不到数据了,给用户相应的提示或者去控制不用在查询接口了剩下就自己优化啦

下面是实现的代码

<nz-table
  #virtualTable
  [nzBordered]="true"
  [nzVirtualItemSize]="54"
  [nzData]="listOfData"
  [nzVirtualForTrackBy]="trackByIndex"
  [nzFrontPagination]="false"
  [nzShowPagination]="false"
  [nzScroll]="{ x: '1200px', y: '240px' }"
>
  <thead>
    <tr>
      <th nzLeft>Full Name</th>
      <th nzLeft>Age</th>
      <th>Index</th>
      <th>Column 1</th>
      <th>Column 2</th>
      <th>Column 3</th>
      <th>Column 4</th>
      <th>Column 5</th>
      <th>Column 6</th>
      <th>Column 7</th>
      <th>Column 8</th>
      <th nzRight>Action</th>
    </tr>
  </thead>
  <tbody>
    <ng-template nz-virtual-scroll let-data let-index="index">
      <tr>
        <td nzLeft>{{ data.name }}</td>
        <td nzLeft>{{ data.age }}</td>
        <td>{{ data.index }}</td>
        <td>{{ data.address }}</td>
        <td>{{ data.address }}</td>
        <td>{{ data.address }}</td>
        <td>{{ data.address }}</td>
        <td>{{ data.address }}</td>
        <td>{{ data.address }}</td>
        <td>{{ data.address }}</td>
        <td>{{ data.address }}</td>
        <td nzRight>
          <a>action</a>
        </td>
      </tr>
      <tr>
        <td colSpan="12" *ngIf="index == listOfData.length - 1">
          <nz-spin></nz-spin>
        </td>
      </tr>
    </ng-template>
  </tbody>
</nz-table>
import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core';
import { NzTableComponent } from 'ng-zorro-antd/table';
import { Subject, takeUntil } from 'rxjs';

@Component({
  selector: 'app-bottom-add-table-real',
  templateUrl: './bottom-add-table-real.component.html',
  styleUrls: ['./bottom-add-table-real.component.less'],
})
export class BottomAddTableRealComponent {
  @ViewChild('virtualTable', { static: false })
  nzTableComponent?: NzTableComponent<any>;
  private destroy$ = new Subject<boolean>();
  listOfData: any[] = [];

  scrollToIndex(index: number): void {
    this.nzTableComponent?.cdkVirtualScrollViewport?.scrollToIndex(index);
  }

  trackByIndex(_: number, data: any): number {
    return data.index;
  }

  ngOnInit(): void {
    const data = [];
    for (let i = 0; i < 100; i++) {
      data.push({
        index: i,
        name: `Edward`,
        age: i,
        address: `London`,
      });
    }
    this.listOfData = data;
  }

  ngAfterViewInit(): void {
    this.nzTableComponent?.cdkVirtualScrollViewport?.scrolledIndexChange
      .pipe(takeUntil(this.destroy$))
      .subscribe(() => {
        const end =
          this.nzTableComponent?.cdkVirtualScrollViewport?.getRenderedRange()
            .end;

        if (end === this.listOfData.length) {
          this.getData();
        }
      });
  }
  timer: any = null;
  getData() {
    if (!this.timer) {
      this.timer = setTimeout(() => {
        const data = [];
        for (let i = 0; i < 100; i++) {
          data.push({
            index: i,
            name: `Edward`,
            age: i,
            address: `London`,
          });
        }
        this.listOfData = [...this.listOfData, ...data];
        clearTimeout(this.timer);
        this.timer = null;
      }, 2000);
    }
  }
  ngOnDestroy(): void {
    this.destroy$.next(true);
    this.destroy$.complete();
  }
}

 

标签:index,end,Column,zorro,ng,address,table,data
From: https://www.cnblogs.com/lslhhh/p/17473509.html

相关文章

  • [GPT] 监测输入框被 js 设置了值 ?input 输入框被设置了 value 值,但是没有触发 change
    1.input输入框被设置了value值,但是没有触发change事件?如果输入框的value值是通过JavaScript代码直接设置的,那么不会触发change事件,这是正常的行为。change事件只会在用户手动更改输入框的值并使其失去焦点时触发。如果输入框的value值是通过用户交互(如键盘输入......
  • Spring配置动态数据库
    前言本文主要介绍使用springboot配置多个数据库,即动态数据库开始搭建首先创建一个SpringWeb项目——dynamicdb(spring-boot2.5.7)然后引入相关依赖lombok、swagger2、mybatis-plus,如下:<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/......
  • Segment Routing 典型应用场景
       ......
  • English Learning Articles 2022-06-11 Your teen wants to get in shape this summer
    Yourteenwantstogetinshapethissummer?Whattosayandwhentoworry|CNN Ifyourchildrensaytheywanttostartexercisingorworkingoutmorethissummer,don’tcelebratejustyet.Iknowmostparentswouldbethrilledtoseetheirteenstakin......
  • Python Django Restful API simple JWT
    在这种情况下,您可以创建一个自定义权限类,并检查用户所属的任何组是否具有相应的权限。例如,您可以在Django后台为每个组定义一个具有读取权限(`view`权限)的权限对象。然后,在自定义权限类中检查用户组是否具有此权限。首先,在`models.py`文件中创建一个新的权限。例如,创建一个名......
  • Redis数据类型之String
    1.string类型数据的基本操作添加/修改数据:setkeyvalue获取数据:getkey删除数据:delkey添加/修改多个数据:msetkeyvaluekey1value1获取多个数据:mgetkeykey1追加信息到原始数据后边(不存在时则添加):appendkeyvalue2.string类型增减操作设置数据增加指定范围的值:incrke......
  • nginx cache命中率设计
    nginx提供了$upstream_cache_status这个变量来显示缓存的状态,我们可以在配置中添加一个http头来显示这一状态,达到类似squid的效果。location/{proxy_redirectoff;proxy_set_headerHost$host;proxy_set_headerX-......
  • SpringCloud第二部分(Gateway、Douker)
    统一网关Gateway为什么需要网关​ API网关作用就是把各个服务对外提供的API汇聚起来,让外界看起来是一个统一的接口。同时也可在网关中提供额外的功能。分布式服务架构、微服务架构与API网关:​ 在微服务架构里,服务的粒度被进一步细分,各个业务服务可以被独立的设计、开发、测......
  • SpringCloud第三部分
    初识elasticsearch​ elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容elasticsearch的作用elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容例如:在GitHub......
  • Nginx+Jwplayer播放流媒体视频
    Nginx+Jwplayer播放流媒体视频JWPlayerisoneofthemostpopularvideoplayersontheInternet.Itisusedbymostmodern“tube”websitesforvideohosting,publishingandadvertising.ItcanbeusedasstandaloneinyourHTMLandFlashcode,orintegratedin......