0
votes

Pourquoi obtenir la "carte" est indéfinie

J'ai un service comme celui-ci:

import { Component, OnInit, PipeTransform } from "@angular/core";
import { UserService } from "./service.service";
import { IUser } from "./users.model";
import { Observable } from "rxjs";
import { map } from "rxjs/operators";

@Component({
  selector: "app-users",
  templateUrl: "./users.component.html",
  styleUrls: ["./users.component.css"]
})
export class UsersComponent implements OnInit {
  allUsers: IUser[];
  page = 1;
  pageSize = 4;
  collectionSize: any;
  constructor(private userService: UserService) {}

  ngOnInit() {
    this.userService.getUsers().subscribe((data: any[]) => {
      this.collectionSize = data.length;
      this.allUsers = data;
    });
  }
  get users(): IUser[] {
    // tslint:disable-next-line:max-line-length
    return this.allUsers.map((user, i) => ({ id: i + 1, ...user 
    })).slice((this.page - 1) * this.pageSize, (this.page - 1) * this.pageSize 
    + this.pageSize);
  }
}


2 commentaires

Les données de vos utilisateurs sont indéfinies


Je dirais que vous essayez d'appeler utilisateurs () avant d'obtenir le résultat de l'abonnement à userservice.getuers () . Comme c'est un appel asynchrone, vous devez attendre l'obtention du résultat pour renseigner ceci.Alutilisateurs .


4 Réponses :


2
votes

essayer d'initialiser allusers variable avant d'attribuer des données: xxx


0 commentaires

2
votes

Cela se produit car les getters en angulaire sont réévalués chaque fois que la détection de changement se produit. Comme Allusers code> est peuplé de manière asynchrone, il y a un certain temps quand il est indéfini. C'est pourquoi vous obtenez cette erreur.

Une solution possible consiste à initialiser allusers code> comme tableau vide afin qu'il ne soit jamais non défini. P>

return this.allUsers.map((user, i) => ({ id: i + 1, ...user 
 })).slice((this.page - 1) * this.pageSize, (this.page - 1) * this.pageSize 
+ this.pageSize);
}


0 commentaires

2
votes

Pour compléter la réponse Maryrio7

Vous faites un appel asynchrone à votre API. Cela signifie que votre récupération peut prendre beaucoup de temps. Bien que votre appel soit en traitement, ceci.Anutilisateurs reste non défini . C'est pourquoi vous obtenez cette erreur.

Dans une seconde fois, lorsque votre opération asynchrone est terminée, ceci.Alutilisateurs est plein et la détection de changement sur la référence est performante. Cela explique pourquoi vous obtenez toutes vos données dans la table. Mais l'erreur s'est également produite auparavant.


0 commentaires

1
votes

Au lieu d'ajouter une solution supplémentaire la plus courte solution possible pour cela pourrait être initialiser allusers code> lorsque vous les définissez, il suffit simplement de modifier

allUsers: IUser[]=[];


0 commentaires