为什么我的角度应用程序在更改支持 mat-tree 的数据后变得非常慢?

2024-01-01

我正在实现角度/材料树组件并遇到一些问题。保存对树的更改后,我正在重置支持树的数据(有效),但是应用程序变得非常慢,扩展节点可能需要大约 8 秒。

更奇怪的是,实际操作数据源的代码是在其他地方运行的,例如向树中添加新的子项 - 我们希望 UI 更新,而这不会导致问题。只有在保存时应用程序才会变慢。

save(): void {
    const trees = this.flattenedTree.filter(node => this.isRootNode(node));

    this.serviceThatHasNoSideEffects.save(trees)
        .then(result => {
            this.tree = result;
            this.flattenedTree = this.getFlattenedTree();
            this.refreshTree();
        });
}

private refreshTree() {
    const data: any[] = this.flattenedTree
        .filter(x => this.isRootNode(x))
        .filter(x => x.children.length > 0 || x.id === this.focusId);

    this.nestedDataSource.data = null;
    this.nestedDataSource.data = data;

    const focusNode = this.getNode(this.focusId);
    this.nestedTreeControl.expand(focusNode);
}

private addChild(parentNode: any, childNode: any) {
    if (!this.getNode(parentNode)) {
        this.flattenedTree.push(parentNode);
    }

    if (!this.getNode(childNode)) {
        this.flattenedTree.push(childNode);
    }

    parentNode.children.push(childNode);

    this.refreshTree();
    this.nestedTreeControl.expand(parentNode);
}

EDIT:

更改刷新树以创建全新的数据源解决了缓慢的问题(内存泄漏?),但不添加子项不会在 UI 中显示。尽管孩子在被压扁的树上,所以应该展示出来。

private refreshTree() {
    const data: any[] = this.flattenedTree
        .filter(x => this.isRootNode(x))
        .filter(x => x.children.length > 0 || x.id === this.focusId);

        this.nestedDataSource = new MatTreeNestedDataSource<theTreeType>();
    this.nestedDataSource.data = data;

    const focusNode = this.getNode(this.focusId);
    this.nestedTreeControl.expand(focusNode);
}

编辑:这是支持它的 html。相当标准。

       <mat-tree-node *matTreeNodeDef="let node" matTreeNodeToggle>
            <li class="mat-tree-node">
                <button mat-icon-button disabled></button>
                {{node.uniqueName}}
            </li>
        </mat-tree-node>

        <!--when has nested child-->
        <mat-nested-tree-node *matTreeNodeDef="let node; when: hasNestedChild">
            <li>
                <div class="mat-tree-node">
                    <button mat-icon-button matTreeNodeToggle>
                        <mat-icon>
                            {{nestedTreeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}
                        </mat-icon>
                    </button>
                    {{node.uniqueName}}
                </div>
                <ul [class.invisible]="!nestedTreeControl.isExpanded(node)">
                    <ng-container matTreeNodeOutlet></ng-container>
                </ul>
            </li>
        </mat-nested-tree-node>
    </mat-tree>

尽管接受的答案似乎提供了一些速度改进,但最终为我完成的解决方案(在 Angular 8 中)是这样的:

https://stackoverflow.com/a/59655114/134120 https://stackoverflow.com/a/59655114/134120

更改官方示例中的行:

<ul [class.example-tree-invisible]="!treeControl.isExpanded(node)">

to this:

<ul *ngIf="treeControl.isExpanded(node)">

这样折叠的子树根本不会加载到 DOM 中。

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

为什么我的角度应用程序在更改支持 mat-tree 的数据后变得非常慢? 的相关文章

随机推荐

  • 使用 JNA 聚焦外部窗口(shell)

    我想使用知道 xterm 标题的 JNA 或 JNI 将焦点集中在 xterm 上 目前我正在使用 xdotools 进行此操作 但我想更改为纯 Java 是否可以 如何 注意 我使用的是ubuntu 11 10 None
  • 虚拟下游设备的 Azure IoT Edge 模块身份转换

    我有以下设置 多个 Modbus 传感器 1 通过 ModbusTCP 连接到这些传感器的网关 在此网关上 一个 Azure IoT Edge 模块正在运行 使用 NodeJS SDK 该模块读取每个连接的传感器的所有值 用于设备管理的 A
  • 是否可以在python中的字典末尾添加

    当我引入新的对时 它被插入到字典的开头 可以在最后追加吗 UPDATE 从 Python 3 7 开始 字典记住插入顺序 https stackoverflow com a 39980744 1258041 通过简单地添加一个新值 您可以确
  • Android Chronometer 从定义的值开始

    我有一个应用程序 在其中向用户显示他正在做的事情的计时器 每当活动进入后台 无论是通过主页按钮还是返回 时 我都会保存该时间 以秒为单位 当活动返回时 我想继续从同一时间运行计时器 用户可能会从列表中选择不同的项目 时间也会不同 而且他可能
  • 使用arduinoEDK通过esp8266调用nest api

    我正在尝试使用 ESP8266 和 Arduino EDK 连接到 Nest API 恒温器 但至今还没有结果 我以前见过有人在这里问过同样的问题 但他的问题的答案对我没有帮助 这是我的代码 Code include
  • Java 连接池最佳实践?

    在厌倦了 c3p0 的持续锁定后 我转向 BoneCP 为我的数据库寻找替代连接池 我有一个服务器应用程序 每分钟处理大约 7 000 个项目 并且需要将这些项目记录到我们的 MySQL 数据库中 我目前有 100 个工作线程 并像这样设置
  • 如何从 CI/CD 管道监控 adf 管道

    我有一个 CD 管道 它会触发 azure 数据工厂 adf 管道 但它 CD 管道 不会等到 adf 管道完成才继续执行下一个任务 我想知道 CD 管道中是否有任何内置功能 我可以通过它们触发和监视 adf 管道 因此 我期望的结果是 C
  • 如何在 gettext .po 文件中指定有序变量?

    我有一个多语言站点 它使用 Zend Translate PHP 数组来处理翻译 它工作正常 但我正在尝试转换为使用 gettext 因为它提供了额外的功能 然而 我还没有发现 gettext 相当于我在 PHP 数组翻译中喜欢的功能 n
  • Chart.js v2.6:向饼图输出值添加箭头

    我正在使用 Chart js v2 6 输出饼图 数据是从MySQL数据库中获取的 图表渲染正确 但我需要向数据值添加箭头 如下面的屏幕截图所示 带箭头的饼图示例 下面是我使用 Chart js 输出饼图的代码 var chartdata
  • java 打印一个三角形

    我正在尝试制作一个程序 该程序接受用户输入 例如三角形应该有多长及其方向 我遇到的问题是 在我运行程序后 它不断向程序添加更多数字 例如 State the length of the two sides finish with 1 5 S
  • 将 Microsoft.AspNet.Identity 升级到 rc1 后找不到 IdentityStoreManager

    将 Microsoft AspNet Identity Core 升级到 1 0 0 rc1 后 由 Visual Studio 2013 中的默认 MVC5 模板生成的 AccountController cs 和 AppModel cs
  • HTML5 是一种编程语言吗?

    如今 我们可以使用 HTML5 来制作应用程序 例如在 android firefox 操作系统 iPhone 黑莓等中 但是 我听说HTML是一种标记语言 不是用于编程的 即使有了应用程序功能 HTML 仍然是only标记语言 编程语言具
  • 使用架构组件导航从单个活动传递数据以启动目标片段

    我有以下内容Activity 这是我的应用程序中的唯一一个 MainActivity java public class MainActivity extends AppCompatActivity Override protected v
  • .NET 7/8 如何使用 Minimap API 提供组的描述/摘要?

    我添加了一组最小的 API 如下所示 var myapi app MapGroup myapi WithTags My API WithOpenApi and then myapi MapGet GetAllStuff WithName G
  • Oracle/SQL - 合并来自“不相关”不相关表的计数

    假设我有两张桌子GOOD and BAD存储小部件生产的记录 我的桌子看起来像这样 Widget Good Widget A Y Widget A Y Widget B Y Widget Bad Widget A Y Widget B Y
  • 您是否必须取消订阅组件中的 QueryList?

    当使用 ContentChildren or ViewChildren用于监听 DOM 元素更改的装饰器 我是否必须取消订阅QueryList 例如 Component export class ParentComponent implem
  • 在wpf中动态添加列到DataGrid

    我目前正在处理自定义画布 并且必须添加一个表格 所以我认为 dataGrid 就可以了 所以我想创建一个 Table from 数据网格 用户可以通过它在运行时将表格添加到画布 到目前为止 我已经尝试使用列表填充 DataGrid 并成功了
  • 有效地重新格式化数据布局

    我有几个 Excel 电子表格 其数据布局如下raw data https i stack imgur com QOju9 jpg company company1 company2 company3 currency Y E 1 1 20
  • Java 中的 Byte 和 Short 的要点(我已阅读其他问题)

    我的问题是 如果我从 Java 反汇编中得到它 当我使用 byte a 3 b 5 System out println a b 实际上会使用 int 而不是 byte 此外 所有本地内存插槽都是 4B 就像堆栈插槽一样 我意识到分配一个字
  • 为什么我的角度应用程序在更改支持 mat-tree 的数据后变得非常慢?

    我正在实现角度 材料树组件并遇到一些问题 保存对树的更改后 我正在重置支持树的数据 有效 但是应用程序变得非常慢 扩展节点可能需要大约 8 秒 更奇怪的是 实际操作数据源的代码是在其他地方运行的 例如向树中添加新的子项 我们希望 UI 更新