J'essaye d'obtenir les détails d'un seul article mais j'obtiens toujours cette erreur; ERREUR TypeError: impossible de lire la propriété 'title' de undefined dans Object.eval [as updateRenderer]. Bien que les données soient correctement obtenues dans console.log mais ne s'affichent pas sur la page elle-même. quand je fais {{post? .title}}, l'erreur disparaît mais les résultats n'apparaissent toujours pas sur la page mais s'affichent correctement dans console.log
Ionic Framework: v4 Plate-forme du système d'exploitation: Windows 10
post.service
post: author_id: 0 body: "<p>This is the body of the lorem ipsum post</p>" category_id: null created_at: "2019-06-13 17:08:45" excerpt: "This is the excerpt for the Lorem Ipsum Post" featured: 0 id: 1 image: "posts/post1.jpg" meta_description: "This is the meta description" meta_keywords: "keyword1, keyword2, keyword3" seo_title: null slug: "lorem-ipsum-post" status: "PUBLISHED" title: "Lorem Ipsum Post"
post.page.ts
<ion-card-header>
<ion-card-title text-center>{{loadedPost.title}}</ion-card-title>
</ion-card-header>
post.page.html
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { PostService } from '../post.service';
@Component({
selector: 'app-post',
templateUrl: './post.page.html',
styleUrls: ['./post.page.scss'],
})
export class PostPage implements OnInit {
loadedPost: any;
constructor(private activatedRoute: ActivatedRoute, private postService: PostService) { }
ngOnInit() {
const postId = this.activatedRoute.snapshot.paramMap.get('postId');
this.postService.getPost(postId).subscribe(result => {
console.log('details: ', result);
this.loadedPost = result;
});
}
}
Sortie console.log
getAllPosts(): Observable<any> {
return this.http.get(`${this.url}`).pipe(
map(results => {
console.log('Raw: ', results);
return results['posts'];
})
);
}
getPost(postId: string) {
return this.http.get(`${this.url}/${postId}`);
}
capture d'écran de console.log: Capture d'écran de la réponse console.log
5 Réponses :
Essayez ceci:
<ion-card-header>
<ion-card-title text-center>{{loadedPost && loadedPost.title}}</ion-card-title>
</ion-card-header>
C'est exactement la même chose que de faire {{sharedPost? .Title}} qui ne change rien par rapport à ce qui est expliqué dans l'OP.
avec {{sharedPost? .title}} l'erreur disparaît mais le titre n'est pas affiché sur la page
J'ai une autre solution avec asyc, essayez ceci:
en TS
<ion-card-header>
<ion-card-title text-center>{{(loadedPost$ | async)?.title}}</ion-card-title>
</ion-card-header>
en HTML
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { PostService } from '../post.service';
import { Observable } from 'rxjs/Observable';
@Component({
selector: 'app-post',
templateUrl: './post.page.html',
styleUrls: ['./post.page.scss'],
})
export class PostPage implements OnInit {
loadedPost$: Observable<any>;
constructor(private activatedRoute: ActivatedRoute, private postService: PostService) { }
ngOnInit() {
const postId = this.activatedRoute.snapshot.paramMap.get('postId');
this.loadedPost$ = this.postService.getPost(postId)
}
}
p >
@captain êtes-vous absolument sûr que la réponse a une propriété title au niveau supérieur de l'objet? Pourriez-vous s'il vous plaît ajouter à votre question la sortie de console.log (résultat) ? Cette réponse devrait fonctionner à moins que nous manquions quelque chose d'autre ...
@captain, pour le débogueur, mettez ceci {{sharedPost $ | async | json}} en HTML, montre-nous le résultat
je viens de mettre le résultat du journal de la console dans la question
D'après l'image de console.log (résultat) , il semble que la réponse ressemble à ceci:
<ion-card-header>
<ion-card-title text-center>{{ loadedPost?.title }}</ion-card-title>
</ion-card-header>
Vous devez donc attribuer votre sharedPost comme ceci:
// ...
this.postService.getPost(postId).subscribe((result: any) => {
console.log('post: ', result.post);
this.loadedPost = result.post; // <----- I've changed this!
});
Et puis afficher le titre comme ceci:
{
"post": {
"title": "..."
}
}
S'il vous plaît notez que le ? dans {{sharedPost? .title}} est nécessaire car la propriété sharedPost est attribuée par une méthode asynchrone. être indéfini dans un premier temps jusqu'à ce que l'API renvoie la réponse.
Merci beaucoup! ... cela n'a pas vraiment fonctionné mais cela m'a mis dans la direction ... Je vais montrer ce que j'ai fait ci-dessous ...
Heureux d'entendre que cela a aidé @captain. Puis-je demander pourquoi cela n'a pas fonctionné?
quand je fais result.post cela donne cette erreur ... La propriété 'post' n'existe pas sur le type 'Object'.
Oh, je vois ... Ok, j'ai quand même mis à jour la réponse pour corriger cette erreur de typographie .subscribe ((result: any) => {...} ; :)
selon ce que @sebaferreras a souligné dans le console.log (résultat) , je l'ai fait à la place;
<ion-card-header>
<ion-card-title text-center>{{loadedPost?.post.title}}</ion-card-title>
</ion-card-header>
Vous pouvez utiliser opérateur de navigation sécurisée dans votre html fichier, comme ceci: {{sharedPost? .title}} ou utilisez ngIf pour vérifier si sharedPost est initialisé:
<ion-card-header *ngIf="loadedPost">
<ion-card-title text-center>
{{loadedPost.title}}
</ion-card-title>
</ion-card-header>
Pourriez-vous s'il vous plaît essayer en injectant des zones dans votre constructeur comme ceci:
constructor (private ngZone: NgZone, ...) {}puis en faisantthis.ngZone.run (() => { this.loadedPost = résultat;})? Si cela fonctionne, j'ajouterai une réponse fournissant plus d'informations.ça n'a pas marché non plus
Je pense avoir trouvé le problème, veuillez vérifier ma réponse ci-dessous