Erreur GET Request from API undefined error
Les données sont affichées mais la console affiche une erreur non définie à la ligne 46: ERREUR TypeError: impossible de lire la propriété 'detaljne' de undefined et ERREUR Contexte PostComponent.html: 46
JSON est imbriqué dans JSON-Server
TS
{ "id": 1, "detaljne": [ { "name": "Marka", "value": "Audi" }, { "name": "Model", "value": "A6" } ] },
HTML
XXX
post.model.ts
import { Detaljne } from "./detaljne.model"; import { Deserializable } from "./deserializable.model"; export class Post implements Deserializable { public id: number; public detaljne: Detaljne[]; deserialize(input: any): this { Object.assign(this, input); this.detaljne = input.detaljne.map(detaljne => new Detaljne().deserialize(detaljne) ); return this; } }
JSON
<div *ngFor="let detaljne of post.detaljne" class="row-info"> <p>{{ detaljne.name }}</p> <p>{{ detaljne.value }}</p> </div>
3 Réponses :
Vous essayez d'accéder à une propriété de post
dans votre * ngFor
, mais vous ne vérifiez pas si post
lui-même existe encore.
Pour résoudre ce problème, vous pouvez utiliser *ngIf
L'utilisation de * ngIf = "post"
ne rendra pas l'élément HTML tant que l'article n'est pas défini.
<ng-container *ngIf="post"> <div *ngFor="let detaljne of post.detaljne" class="row-info"> <p>{{ detaljne.name }}</p> <p>{{ detaljne.value }}</p> </div> </ng-container>
Remarque: Vous ne pouvez pas utiliser * ngFor
et * ngIf
sur le même élément, donc vous utilisez
qui est juste un 'wrapper' qui ne créera pas d'élément réel sur le DOM.
Alternativement, il y a l'opérateur de navigation sécurisé ?
, ce qui est légèrement différent car c'est comme faire post! == null? product.detaljne: null
. Les deux options sont valides, il suffit de choisir celle qui convient le mieux :)
Au lieu d'ajouter une couche supplémentaire de * ngIf
. Il doit être résolu avec opérateur de navigation sécurisée (?.)
L'erreur est partie! Merci @Jojofoulk! Pouvez-vous me dire quelque chose à propos de cette erreur juste pour savoir pour l'avenir?
Mettez à jour la réponse pour expliquer ce qui se passait :)
Aha, maintenant c'est plus clair pour moi ... merci encore @Jojofoulk
@Jojofoulk: l'ajout d'une couche supplémentaire de * ngIf n'est pas nécessaire, voir ma réponse.
J'ai mis à jour mon commentaire et abordé ce point. Les deux approches diffèrent légèrement mais elles sont toutes deux valables.
Cela devrait suffire, vous n'avez pas besoin d'ajouter une couche supplémentaire de *ngIf
:
post = null;
Voir cette démo fonctionnelle:
https : //stackblitz.com/edit/ngfor-example-7ipt7m? file = app / app.component.ts
Result:
remplacez simplement:
post = { "id": 1, "fetchData": [ { "name": "Marka", "value": "Audi" }, { "name": "Model", "value": "A6" } ] };
Par:
<div *ngFor = "let detaljne of post?.fetchData"> <p>{{ detaljne.name }}</p> <p>{{ detaljne.value }}</p> </div>
La raison est qu'il faut un certain temps pour obtenir la réponse. Utilisez donc les promesses pour retarder le chargement des données.
this._customerService.getCustomers().subscribe(data => this.customers = data);
utilisez ceci sous les promesses.
Essayez d'utiliser
post? .Detaljne
dans le ngFor pour voir si cela fonctionneJ'ai déjà essayé mais pas utile
Essayez de fournir une démonstration pour reproduire votre erreur.