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

Não importa

Eu tenho uma api que envia dados do backend, então quando tento pegar esses dados no meu angular os dados não são carregados na primeira vez, e minha tabela fica vazia, mas se por exemplo imprimir os dados que vêm do banckend antes de configurar no meu DataSource, minha tabela está preenchida corretamente.

Meu código é:

user-datasource.ts

export class UserListDataSource extends DataSource<User> {
  data: User[];
  paginator: MatPaginator;
  sort: MatSort;

  constructor(private usersService: UsersService) {
    super();
  }

  connect(): Observable<User[]> {
    this.data = this.usersService.usersList();
    //this.data.forEach(u => console.log(u.id)); <<---------- When I log this, My data is fill corectly
    const dataMutations = [
      observableOf(this.data),
      this.paginator.page,
      this.sort.sortChange
    ];

    return merge(...dataMutations).pipe(map(() => {
      return this.getPagedData(this.getSortedData([...this.data]));
    }));
  }
  ...

}

userService

export class UsersService {

  users: User[];

  constructor(private http: HttpClient) {}

  usersList() {    
    this.http.get(`${environment.apiUrl}/users`).pipe(
      map((jsonArray: Object[]) =>  jsonArray.map(jsonItem => User.fromJson(jsonItem)))
    ).subscribe((users: User[]) => { this.users = users; });

    return this.users;
  }

}

componente

export class UserListComponent implements AfterViewInit, OnInit {
  @ViewChild(MatPaginator) paginator: MatPaginator;
  @ViewChild(MatSort) sort: MatSort;
  @ViewChild(MatTable) table: MatTable<User>;

  dataSource: UserListDataSource = new UserListDataSource(this.usersService);

  displayedColumns = ['id', 'email', 'username'];

  constructor(private usersService: UsersService) { }

  ngOnInit() {}

  ngAfterViewInit() {
    this.dataSource.sort = this.sort;
    this.dataSource.paginator = this.paginator;
    this.table.dataSource = this.dataSource;
  }
}

Não tenho certeza se uso a maneira correta de preencher minha mesa ou estou perdendo alguma coisa.

Pelo que vejo, acho que o backend demorou muito mais do que o frontend para carregar os dados, em outras palavras, o frontend não está esperando o tempo necessário para obter os dados do backend.

Existe alguma maneira de consertar isso, por favor?


Nota: Eu uso esquemáticos de material angular para criar tudo isso, no código padrão, ele usa um dado estático, que não é a solução para mim, que eu preciso para usar dados dinâmicos.

VRoxa

Você deve aguardar a resposta do servidor antes de enviar as coleções dos usuários de volta.

UsersService

usersList(): Observable<User[]> {    
    return this.http.get(`${environment.apiUrl}/users`).pipe(
      map((jsonArray: Object[]) =>  jsonArray.map(jsonItem => User.fromJson(jsonItem)))
    );
}

UserService apenas retorna a promessa da coleção do usuário.
No seu UserListComponent, crie um MatTableDataSourcedo tipo Usere aguarde os dados do seu serviço. Então, uma vez preenchido, adicione esses dados ao datasource.

export class UserListComponent implements OnInit, AfterViewInit {

  private users: User[] = [];
  dataSource = new MatTableDataSource<User>();
  columns: string[] = ['...'];

  @ViewChild(MatPaginator) paginator: MatPaginator;
  @ViewChild(MatSort) sort: MatSort;

  constructor(private service: UsersService) {}

  ngOnInit(): void {
    this.service.usersList().subscribe(users => {
      this.users = users;
      this.dataSource.data = this.users;
    });
  }

  ngAfterViewInit(): void {
    this.dataSource.sort = this.sort;
    this.dataSource.paginator = this.paginator;
  }
}

E, o último ponto. Use a dataSourceentrada da tabletag para vincular seu MatTableDataSourceà tabela.

<table [dataSource]="dataSource">
  <!-- ... -->
</table>

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

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

Angular 6 Obtenha dados classificados da Tabela de Materiais

Filtro da fonte de dados da tabela de materiais com valor da coluna

Como formatar adequadamente esses dados para a Tabela de Materiais [dataSource]?

Filtro de fonte de dados da tabela de materiais com valor de coluna - ERROR matColumnDef

A pesquisa não funciona com a tabela de materiais React usando dados remotos

Angular - FormArray com Tabela de Materiais e linha de dados estava incorreta

Buscando dados de tabela junto com dados de blob usando API da web

Tabela de atualização da tabela de dados de materiais Angular4 sem recarregar a página

Usando Angular NgFor para preencher a tabela de dados html com dados da matriz JSON

Mapeando Dados com Reactjs de Tabela de Materiais

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

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

Como renderizar imagens de um url no fluxo de dados na célula da tabela de materiais usando React

Preencha uma tabela de dados com JSON (api) em Javascript puro

Filtragem de tabela com tubos usando ngfor e dados de API da web

Componente 'filho' da Tabela Angular de Materiais que gera colunas

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

Preencha os dados da tabela com o valor correspondente selecionado na linha específica da tabela

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

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

Preencha a primeira coluna da tabela com itens de matriz - JavaScript

Tabela de dados de material angular da API restante

Incapaz de vincular os dados à Tabela Angular de Dados de Materiais

Acessando dados da tabela de relacionamento em sqlalchemy com API

A tabela de dados angulares de materiais não está sendo preenchida com dados

Preencha a tabela da lista usando QUERY / FILTER

Atualize uma única linha da tabela de materiais que é originalmente originada de dados remotos

Seleção e paginação remota de dados na reação da tabela de materiais