J'ai un composant parent avec route/home qui contient une liste et quand un élément de la liste est cliqué, je navigue vers/home/edit/listid et met à jour la base de données. Après la mise à jour de la base de données, je retourne à/home. Mais la liste n'est pas mise à jour jusqu'à ce que j'actualise la page manuellement. J'ai aussi essayé d'appeler dataservice.getList () après la mise à jour de la base de données, mais pas de chance . Voici mon code. Quelqu'un peut-il m'aider s'il vous plaît à identifier ce qui me manque?
Composant Home
ngOnInit() {
this.loadList();
}
loadList() {
this.dataservice.getList().subscribe(
res => {
this.List= res;
},
err => {
console.log('Error Occoured');
console.log(err);
}
);
}
DataService getList ()
getList(): Observable<any[]> {
return this.http.post<any[]>('https://resturl/Prod/getdata', {
'operation': 'getData'
}
});
}
Liste d'édition
this.dataservice.updateList().subscribe(
updateAccRes => {
this.dataservice.getList();
this.router.navigate(['/home']);
}
},
error2 => {
console.log(error2);
}
);
JavaScript est asyn est votre problème. Lorsque vous accédez à Accueil, la réponse de la liste mise à jour n'a pas encore été renvoyée. Vous devez donc recharger manuellement la page. Une solution à cela consiste à avoir une variable commune dans le service accessible aux deux composants et à * ngIf dans le code HTML de votre composant domestique pour rechercher les mises à jour de la variable commune.
Edit List Il vous suffit de mettre à jour les éléments ici. La navigation doit être appelée à l'intérieur de this.dataservice.getList () pour s'assurer qu'elle attend la réponse de l'appel getList ().
this.dataservice.updateList().subscribe(
updateAccRes => {
this.dataservice.getList();
}
},
error2 => {
console.log(error2);
}
);
DataService getList () Créez une variable commune ici, mettez-la à jour avec la réponse de getList (), puis accédez à/home
latestList: any;
getList(): Observable<any[]> {
return this.http.post<any[]>('https://resturl/Prod/getdata',
{'operation': 'getData'})
.subscribe(response => {
this.latestList = response.list;
this.router.navigate(['/home']);
},
error => {
console.log(error);
}
)};
Composant Accueil Maintenant, après le retour de la liste mise à jour, nous sommes dirigés vers page d'accueil , et la liste mise à jour est prête à être affichée sans recharger manuellement la page.
listOfItems: any
constructure(private dataService : DataService){
// latestList is accessible here because it is a property of DataService
this.listOfItems = this.dataService.latestList;
};
home.component.html Vous pouvez vérifier l'existence de la liste mise à jour ici. S'il existe, montrez-le. S'il n'existe pas, affichez le message "loading ....".
<div class="list" *ngIf="listOfItems"> <!-- Display list here --> </div>
<div *ngIf="!listOfItems"> Loading.......... </div>
Vous pouvez ajouter un service contenant la liste d'éléments, .__ Et dans votre composant edit-list, vous mettrez à jour l'élément dans le service . et dans edit-list-composant.
Exemple:
class ItemsService{
list: Items[];
getItemById(index){
return list[index];
}
updateItemById(item, index){
this.list[index] = item;
}
}
class EditListComponent{
item:Item;
index:number;
...
this.item = this.itemsService.getItemById(index);
updateBtnClick(){
this.itemsService.updateItemById(item, index);
}
}