在 Angular Material 2 表中使用虚拟滚动和 @angular/cdk-experimental

2024-02-11

我有一个表显示很多行,我想优化它的性能。我通过使用虚拟滚动技术找到了解决方案。这是一个例子Angular Material CDK 虚拟滚动视口组件 https://github.com/angular/material2/tree/master/src/cdk-experimental/scrolling用一个简单的div我发现:

<cdk-virtual-scroll-viewport class="list-container lg" [itemSize]="52.5">
  <div *cdkVirtualFor="let state of statesObservable | async;" class="list-group-item">
     <div class="state">{{state.name}}</div>
     <div class="capital">{{state.capital}}</div>
  </div>
</cdk-virtual-scroll-viewport>

但是,我想将它与角材料表 https://material.angular.io/components/table/overview像下面这样

<table mat-table [dataSource]="dataSource">
    <ng-container  *ngFor="let c of displayedColumns" [matColumnDef]="c">
      <th mat-header-cell *matHeaderCellDef>{{getTitle(c)}}</th>
      <td mat-cell style="white-space: pre-wrap;" *matCellDef="let element"> {{element[c]}}</td>
    </ng-container>
    <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
    <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
 </table>

我想知道如何包装它cdk-virtual-scroll-viewport to mat-table。我的表格最多显示 1000 行和 20 多列,加载和滚动时性能非常慢。

PS:我知道可以通过使用来解决分页器 https://material.angular.io/components/paginator/overview,但我不想那样做。

Versions

  1. "@angular/material": "^6.2.0"
  2. @angular/cdk": "^6.2.0"
  3. @angular/cdk-experimental": "^6.2.1"
  4. "@angular/core": "6.0.3"
  5. "@angular/cli": "6.0.7"

这不是目前现成的东西。这CdkTable (or MatTable) 组件不支持虚拟滚动YET.

虚拟滚动支持融入@angular/cdk仍处于实验阶段 - 这将在版本 7 中改变。

然而,当这个功能落地后,下一步将是在桌子上实现它。我会解释原因。

cdk-virtual-scroll-viewport是一个容器*cdkVirtualFor指令,如果我们研究这个指令(CdkVirtualForOf)我们可以看到

  1. It 实施 CollectionViewer (code https://github.com/angular/material2/blob/6.4.x/src/cdk-experimental/scrolling/virtual-for-of.ts#L70-L72)

  2. 它接受(与)DataSource实例 (code https://github.com/angular/material2/blob/6.4.x/src/cdk-experimental/scrolling/virtual-for-of.ts#L78-L90)

考虑到这一点,让我们看看CdkTable

  1. It 实施 CollectionViewer (code https://github.com/angular/material2/blob/master/src/cdk/table/table.ts#L156)

  2. 它接受(与)DataSource实例 (code https://github.com/angular/material2/blob/master/src/cdk/table/table.ts#L312-L319)

相似性并非偶然,该表(经过一些调整)可以被使用cdk-virtual-scroll-viewportcdkVirtualFor用来。

我不确定最终的实现是什么,开发人员是否能够从外部包装表格,或者表格将在内部设置它,但这就是它的方向。

如果我不得不猜测,我会说开发人员会选择是否想用虚拟卷轴包裹桌子。这是因为cdk-virtual-scroll-viewport不查询cdkVirtualFor (via ViewChild),它是被动的,等待有东西附加它。这表明这是预先考虑好的。

您现在就可以通过扩展来做到这一点CdkTable并自己进行调整,这需要了解表的内部结构,并且可能需要一些时间。我建议稍等一下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Angular Material 2 表中使用虚拟滚动和 @angular/cdk-experimental 的相关文章

  • 如何获取与 Node.js 中的 TypeScript 文件行数相关的错误信息?

    我正在使用 TypeScript 进行 Node js 后端开发 每当我在 node js 中遇到错误时 它都会显示与已转译的 JavaScript js 文件相关的行号 而不是与 TypeScript ts 文件相关的行号 如果您使用了
  • 单元测试 HttpClientModule 时出错(Angular 4.3+)

    我正在探索新的 Angular HttpClientModule 并遇到莫名其妙的错误 该模块足够新 我还找不到任何有关如何进行单元测试的有用信息 并且官方文档没有任何示例 该应用程序包含一个具有一种方法的服务 该方法将 URL 传递给ht
  • 所有 'size' 、 'prototype' 的声明必须具有相同的修饰符

    I have downloaded code from repository and run it on local getting these errors have following versions when i run ionic
  • 由于 ngIf 语句,存储选择未运行

    我正忙于 MeteorJS 和 RxJS 它们正在退出 但有时也有点令人困惑 我当前的问题只是 Angular NgRx 问题 与 MeteorJS 无关 正如您在示例中看到的 有一个ngIf基于showChannels 该布尔值设置为fa
  • router.navigate 更改 URL,但不渲染组件

    而不是使用 a href my path my param a 在我的模板中 我愿意使用带参数的函数将我重定向到页面 所以 这就是我在 ts 文件中构建函数的方式 redirectToChat my param this router na
  • 是否可以在 Ionic 2 中存储 firebase 数据并以离线模式运行应用程序功能?

    我找到了一些关于 Ionic 2 离线模式 firebase 的教程 但我仍然不知道如何在我的应用程序中启用这个功能 那么 firebase真的支持离线模式吗 如果是 我可以存储所有收到的数据吗 and 在离线模式下运行功能 firebas
  • Angular 2 中的 Observable 和 ngFor

    下面是一个使用 rxjs Observables 的简单示例 Angular 2 组件 import Component OnInit from angular core import Observable from rxjs Observ
  • 如何让热模块重新加载在打字稿 monorepo 中工作

    因此 在过去的几天里 我一直在尝试在基于 Typescript React Koa Mongo 的 monorepo 中进行热模块重新加载 但完全徒劳无功 我感觉我的头一直在撞砖墙 HMR 的文档少之又少 几乎互联网上的所有内容都只是par
  • 如何获取相对于根目录的文件?

    与正常node您可以设置 JavaScriptNODE PATH并需要本地模块 例如给出 project node modules src library index js 您可以设置NODE PATH src and require li
  • Angular 2打开静态页面

    我有 Angular 2 项目 我想在新窗口中打开服务器上可用的静态帮助文件 我试过window open help index html 它导航到该页面 但抛出有关找不到路线的错误 我也尝试在角度区域外运行上面的代码 但没有什么区别 我怀
  • Angular 7 Guard 重定向仅适用于双击

    问题是我已经实现了一个 Guard 旨在处理特定的目录 如果当前用户名的角色等于 2 它应该返回 true 如果没有 那么它不应该重定向 这是我的 app routing module ts 文件 问题出在 userlist 路径中 我们是
  • 模拟 ngrx/store

    这是关于 Angular 2 官方版本的 我知道单元测试在 beta RC 和正式版本之间发生了巨大的变化 当 ngrx store 用作构造函数中的参数时 在单元测试中模拟 ngrx store 的好方法是什么 这并不像嘲笑服务那么简单
  • Angular + Material - 如何使用 formgroup 处理多个复选框

    我有一个从后端获得的兴趣列表 我希望用户能够选择他们想要的兴趣 我将只存储他们在数据库中检查的兴趣 并在他们加载页面时预先填充 但首先我需要获取用户选择的这些兴趣 兴趣组件 ts export class InterestsComponen
  • Angular 2 组件:子对子通信

    我的 Angular 2 应用程序中有三个组件 C0 C1 和 C2 第一个 C0 表示一个 html 模板 具有多个子组件 ui 元素 现在 如果有人点击C1 中的按钮 菜单 我怎样才能通知C2 日历 关于那件事 我尝试了一些例子组件通讯
  • Angular 反应式表单:使用单个 formControlName 同步多个输入

    我正在建造一个反应形式 https angular io guide reactive forms在 Angular 11 中 它分为多个 div 项目所有者希望在每个 div 中进行一些重复输入 以便用户可以编辑某个字段 A 的输入 并且
  • 严格模式下不允许属性的多个定义 - Angular

    我在 IE 中的 Angular 6 项目中遇到了这个问题 这导致应用程序无法加载 它仅发生在应用程序的产品版本中 该版本由 Angular 连接和缩小 在 ngserve 下运行的本地开发版本并未导致该问题 此错误出现在 Chrome 开
  • AOT 编译器 - 包括延迟加载的外部模块

    我试图将外部模块 托管在 git npm 存储库中 作为延迟加载模块包含在我的 Angular 应用程序中 我正在使用 ngc 编译器编译我的外部模块 node modules bin ngc p tsconfig aot json 这是我
  • 如何为 Apollo 的 React HOC 定义 props 接口?

    我正在尝试使用 Apollo 的 React HOC 来获取数据并将其传递给我的组件 但出现以下错误 Argument of type typeof BrandList is not assignable to parameter of t
  • Angular 2:ngModel 输入上“数字”管道的光标问题

    我有一个输入 我想像货币一样显示 我希望只允许两位小数 并且只允许数字 同时在必要时自动添加逗号 基本上 如果用户输入 12345 我希望输入自动显示为 12 345 00 12 345 也可以接受 但如果他们输入 12345 5 则需要显
  • 在 Nest.js 中发送之前如何格式化响应?

    我按照文档进行操作 并能够添加用于响应映射的拦截器 我想要一致的 json 格式输出作为响应 我怎样才能用拦截器或其他比这种方法更好的方法来实现这一点 statusCode 201 message Custom Dynamic Messag

随机推荐

  • 对于特殊字符,URL 编码失败。 #安卓

    我正在研究需要的解决方案encode串入utf 8格式 这个字符串只是我正在读取的设备名称BluetoothAdapter getDefaultAdapter name 对于其中一个示例 我得到了一个像这样的字符串ABC and encod
  • Angular 指令 ng-if 不评估条件语句

    我是 Web 开发和 AngularJS 的新手 我尝试使用指令 ng if 仅在从数据库返回的列表大于 1 时显示 div 块 但它不起作用 我是否滥用了该指令 我环顾四周 没有找到任何有效的解决方案 目前 两个 div 都会显示 并且
  • 通过 Karma 运行时如何调试 PhantomJS

    我通过 Jasmine Karma 和各种浏览器进行测试 我目前正在调试一个仅在 PhantomJS 中失败的测试 我想调试这个调用 所以我在 karma 中设置了一个自定义 PhantomJS 启动器 它在调试端口打开的情况下运行它 我可
  • 检测圆形(非精确圆形)路径算法?

    我收到一个路径 来自触摸事件的 x y 坐标列表 如何检测该路径形成圆形路径 不是完整或精确的圆 有什么算法或方法可以检测到这一点吗 这是一篇论文 总结了将圆拟合到数据的各种方法 http www cs bsu edu homepages
  • ios metal:着色器中使用的变量数量限制

    在向着色器添加一些复杂性后 我今天开始收到以下错误 Execution of the command buffer was aborted due to an error during execution Discarded victim
  • 多个视图控制器上的相同 UIProgressView

    PREAMBLE 我有一个 iOS 应用程序 有两个页面的注册过程 我在每个页面上安装了一个 UIProgressView 来测量用户在所述注册过程中的累积进度 目前 注册过程由六个字段组成 当文本字段完成编辑时 现有的 UIProgres
  • 使用 Moq 可以验证匿名类型的方法调用吗?

    我正在尝试使用 Moq 验证方法调用 但我无法完全正确地理解语法 目前 我已将此作为我的验证 repository Verify x gt x ExecuteNonQuery fav AddFavorites new fid 123 inp
  • 如何删除 bash 中多余的空格?

    如何删除变量中多余的空格HEAD HEAD how to remove extra spaces Result how to remove extra spaces 尝试这个 echo HEAD tr s 或者也许您想将其保存在变量中 NE
  • Ajax 没有 JQuery? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在没有jquery的情况下进行ajax调用 https stackoverflow com questions 8567114 how to make an ajax call without j
  • AWS CLI 命令适用于 Bash,但不适用于 PHP shell_exec()

    我想触发以下命令 aws route53 change resource record sets hosted zone id XXX change batch Comment 2018 06 19 11 31 Changes Action
  • IOHIDEventSystemClientScheduleWithRunLoop 与 EXC_BAD_ACCESS

    我正在尝试在我的应用程序中获取触摸事件 所以我使用 IOHIDFamily 回调来获取事件 我的代码是这样的 void handle event void target void refcon IOHIDServiceRef service
  • React JS 中 value 和 defaultValue 的真正区别是什么?

    在React的主页上 有最后一个example https reactjs org a component using external plugins 使用外部插件的组件 与一个textarea
  • PictureBox 无法正常刷新?

    我是编程新手 如果我问了一个愚蠢的问题 请原谅我 我正在尝试显示从实时摄像头获得的实时图像 当我启动程序时 图片框能够显示该对象 参见图1 当我删除该对象时 它会显示此图像 参见图2 但问题是 当我放回对象时 我应该能够获得类似于图片 1
  • 在循环中创建控件

    我有一些代码可以将新单元格添加到表格中并用文本框填充它们 到目前为止我的编码方式效果很好 TableCell tCell1 new TableCell TableCell tCell2 new TableCell TableCell tCe
  • 如何更改 WordPress 页面上的标题?

    上下文 WordPress 5 4 5 和优斯特搜索引擎优化 https en wikipedia org wiki Yoast SEO 3 7 1 我是一名插件开发人员 可以访问客户的网站 该站点安装了 Yoast 3 7 1 这很重要吗
  • 中间有 T 的日期/时间 (2008-09-18T00:00:00) 怎么称呼?

    如果您有一个像 2008 09 18T00 00 00 这样的日期 它有名称吗 世界标准时间 类似的事情 令人惊讶的是很难用谷歌搜索这个 这是一个组合的日期 时间表示形式 定义为ISO8601 http en wikipedia org w
  • 种子设置:为什么输入不变后输出不同

    设置种子可确保再现性 并且在仿真建模中非常重要 考虑一个简单的模型f 有两个变量y1 and y2出于兴趣 这些变量的输出由随机过程决定 rbinom 和参数x1 and x2 两个感兴趣变量的输出彼此独立 现在假设我们想要将相应参数发生变
  • 如何检测删除按钮UItableviewcell是否被隐藏?

    我有一个包含 UITableView 的视图 当用户滑动时 我可以在单元格上显示删除按钮 如果用户触摸删除按钮 将触发一个方法 这很好用 但是 如果用户决定不删除单元格 并且触摸视图中的任意位置以隐藏删除按钮 我怎样才能检测到这一点 当用户
  • 如何使用brew安装maven而不使用openjdk?

    我的机器上已经安装了 Java HotSpot JDK 11 我正在使用它来进行所有操作 当我打字时brew install maven它尝试安装openjdk作为依赖 我不希望这样 希望 maven 使用我的 JDK 而不是它自己的ope
  • 在 Angular Material 2 表中使用虚拟滚动和 @angular/cdk-experimental

    我有一个表显示很多行 我想优化它的性能 我通过使用虚拟滚动技术找到了解决方案 这是一个例子Angular Material CDK 虚拟滚动视口组件 https github com angular material2 tree maste