如何在不重新渲染的情况下更新垫子树?

时间:2019-05-09 12:11:19

标签: angular asynchronous angular-material treeview

我的mat树重绘使用BehaviorSubject对数据源数据更改进行初始化。

我观察到我不时更新表单,以便更新FlatTreeControl生成的树数据。

该代码非常基础且易于理解,因此我看不到该问题。

我尝试在stackBlitz上使用角扁平树示例的简化版本: https://stackblitz.com/angular/rlqvokgplrko?file=app%2Ftree-checklist-example.ts

这是我的版本: https://stackblitz.com/edit/create-iq2meg

我期望的是,就像官方的mat-tree示例中一样,数据是动态更新的,而不必重新绘制整个树并让它每次崩溃。

1 个答案:

答案 0 :(得分:0)

我们可以使用GitHub by @danielkuhlwein

中提到的解决方法

在进行任何重新渲染之前,将展开的节点保存到列表中:

saveExpandedNodes() {
    this.expandedNodes = new Array<BulletFlatNode>();
    this.treeControl.dataNodes.forEach(node => {
        if (node.expandable && this.treeControl.isExpanded(node)) {
            this.expandedNodes.push(node);
        }
    });
}

然后在执行重新渲染后还原展开的节点:

restoreExpandedNodes() {
    this.expandedNodes.forEach(node => {
        this.treeControl.expand(this.treeControl.dataNodes.find(n => n.id === node.id));
    });
}