Expandir / recolher a árvore de materiais usando dados booleanos (Angular 7)

Lars Rødal

Estou tentando obter uma árvore de materiais trabalhando com booleanos de sua fonte de dados. Estou filtrando datasource.data na entrada, o que causa o colapso da árvore sempre que o usuário insere algo. Para evitar isso, gostaria de usar um booleano na linha específica para expandir / recolher a árvore de materiais. Fiz isso com sucesso com a mesa de material, mas não consigo fazer funcionar com a árvore. Isso é o que eu tenho até agora:

Arquivo HTML:

<mat-tree [dataSource]="nestedDataSource" [treeControl]="nestedTreeControl" class="example-tree">
  <mat-tree-node *matTreeNodeDef="let node">
    <li class="mat-tree-node">
      <button mat-icon-button disabled></button>
      {{node.name}}
    </li>
  </mat-tree-node>

  <mat-nested-tree-node *matTreeNodeDef="let node; when: hasNestedChild">
    <li>
      <div class="mat-tree-node">
        <button mat-icon-button
                [attr.aria-label]="'toggle ' + node.name"
                click="changeState(node)">
          <mat-icon class="mat-icon-rtl-mirror">
            {{node.expanded ? 'expand_more' : 'chevron_right'}}
          </mat-icon>
        </button>
        {{node.name}} ({{node.expanded}})
      </div>
      <ul [class.example-tree-invisible]="node.expanded">
        <ng-container matTreeNodeOutlet></ng-container>
      </ul>
    </li>
  </mat-nested-tree-node>
</mat-tree>

Arquivo TS:

import {NestedTreeControl} from '@angular/cdk/tree';
import {Component, Injectable} from '@angular/core';
import {MatTreeNestedDataSource} from '@angular/material/tree';
import {BehaviorSubject} from 'rxjs';

/**
 * Json node data with nested structure. Each node has a filename and a value or a list of children
 */
export class FileNode {
  childGroups: FileNode[];
  name: string;
  expanded: boolean;
}

/**
 * The Json tree data in string. The data could be parsed into Json object
 */
const TREE_DATA = [
  {
  'name': 'Group 1',
  'expanded': false,
  'childGroups': [
    {
      'name': 'Childgroup 1',
      'expanded': false,
      'childGroups': []
    },
    {
      'name': 'Childgroup 2',
      'expanded': false,
      'childGroups': [
        {
          'name': 'Child of child',
          'expanded': false,
          'childGroups': []
        }
      ]
    }
    ]
  },
    {
  'name': 'Group 2',
  'expanded': false,
  'childGroups': [
    {
      'name': 'Childgroup 1',
      'expanded': false,
      'childGroups': []
    },
    {
      'name': 'Childgroup 2',
      'expanded': false,
      'childGroups': [
        {
          'name': 'Child of child',
          'expanded': false,
          'childGroups': []
        }
      ]
    }
    ]
  },
    {
  'name': 'Group 3',
  'expanded': false,
  'childGroups': [
    {
      'name': 'Childgroup 1',
      'expanded': false,
      'childGroups': []
    },
    {
      'name': 'Childgroup 2',
      'expanded': false,
      'childGroups': [
        {
          'name': 'Child of child',
          'expanded': false,
          'childGroups': []
        }
      ]
    }
    ]
  },
]

@Component({
  selector: 'tree-nested-overview-example',
  templateUrl: 'tree-nested-overview-example.html',
  styleUrls: ['tree-nested-overview-example.css']
})
export class TreeNestedOverviewExample {
  nestedTreeControl: NestedTreeControl<FileNode>;
  nestedDataSource: MatTreeNestedDataSource<FileNode>;

  constructor() {
    this.nestedTreeControl = new NestedTreeControl<FileNode>(this._getChildren);
    this.nestedDataSource = new MatTreeNestedDataSource();
    this.nestedDataSource.data = TREE_DATA;
  }

  hasNestedChild = (_: number, nodeData: FileNode) => 
  nodeData.childGroups.length > 0;

  private _getChildren = (node: FileNode) => node.childGroups;

  changeState(node) {
    console.log(node);
    node.expanded = !node.expanded;
  }
}

Stackblitz

Gordon Westerman

Da documentação Angular sobre a entrada do usuário :

Para vincular a um evento DOM, coloque o nome do evento DOM entre parênteses e atribua uma instrução de modelo entre aspas a ele.

Tudo o que você precisa fazer é alterar clique para (clique) .

DEMO

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Como posso expandir e recolher um <div> usando javascript?

Recolher / expandir optgroup usando select2

Recolher / expandir o texto no widget de texto

recolher / expandir animação em Angular

Angular Material 6.0.1 Árvore padrão aberta e expandir / recolher tudo

Angular 6 Obtenha dados classificados da Tabela de Materiais

Como expandir / recolher uma visualização em árvore recursiva no Angular 2?

Angular 5 expandir / recolher lista

Expandir / recolher a árvore de materiais usando dados booleanos (Angular 7)

Angular 7 - Expandir ou recolher Divs em um loop For

Como expandir / recolher grupos usando PrimeNG?

Como executar 'Expandir' e 'Recolher' na visualização em árvore do Kendo clicando no botão Expandir e no botão Recolher

Recolher / Expandir div aninhado no Angular 6

Angular 7: adicionar linhas dinamicamente à tabela de dados de materiais

Layout responsivo do Angular 7 usando grade de materiais

Como fazer a classificação por estrelas usando o botão de ícone angular de 7 materiais?

Evento a ser chamado depois de expandir ou recolher uma visualização em árvore de kendo do nó

É possível substituir os dados em uma tabela que possui uma árvore de dados sem automaticamente recolher / expandir a árvore?

Preencha a tabela de materiais com dados da API usando DataSource angular

Expandir Recolher conteúdo DIV usando CSS puro ou uma combinação de CSS e JS

Recolher / expandir simples usando jquery dentro de um loop php foreach

Expandir / recolher itens da lista no menu em árvore recursiva no angular

Expandir / recolher dados da tabela

Obtenha dados da caixa de texto e exiba no angular 6 usando materiais

Tabelas filhas com tabelas de dados (expandir / recolher)

Árvore de dados de rota angular

Expandir / recolher div dentro da tabela html recuperando dados do banco de dados

No angular 8/9, qual é a maneira correta de adicionar o tipo de data na interface para dados usando a tabela de materiais?

Observer subscribe não carrega os dados para dataSource, usando a tabela de materiais Angular

TOP lista

quentelabel

Arquivo