comment faire pour actualiser la page après avoir supprimer dans angular5
J'ai été faire une moyenne de la pile application de shopping(Angulaire 5). J'ai fait un gérer des composants du produit, une liste de tous les produits et un bouton supprimer.
Supprimer le bouton fonctionne, mais le produit est listé dans le tableau jusqu'à maintenant, comme il a été supprimé de la base de données.
Donc, je me demandais est-il possible de re-rendre ou à l'actualisation de la composante après la suppression.
J'ai essayé de naviguer à la même page, mais il ne fonctionne pas comme angulaires ne le permet pas.
Svp quelqu'un peut aider.
Je ne pouvais pas trouver tout de réponse précise à ma question sur stackoverflow j'ai donc dû lui demander.
Mon gérer le produit.composante.ts :-
import { Component, OnInit } from '@angular/core';
import { ProductManageService, ProductDetails } from '../product-manage.service';
import { AllService } from '../all.service';
import { HttpClientModule, HttpClient } from '@angular/common/http';
import { Router } from '@angular/router';
import { Location } from '@angular/common';
@Component({
selector: 'app-manage-product',
templateUrl: './manage-product.component.html',
styleUrls: ['./manage-product.component.css']
})
export class ManageProductComponent implements OnInit{
prodData : ProductDetails = {
prodName: '',
prodPrice: '',
prodImage: '',
prodSize: ''
}
data: any=[];
constructor(private add:ProductManageService,
private router: Router,
private http:HttpClient,
private allService :AllService,
private location : Location) { }
addProduct(){
this.add.addProduct(this.prodData).subscribe(()=>{
console.log("SENT",this.prodData);
},(err)=>{
console.log("Error",err);
})
}
delFunc(id){
//console.log("Delete ",id);
this.add.deleteProd(id);
this.router.navigateByUrl("/reload");
}
ngOnInit() {
this.allService.getAlldata().subscribe(data =>{
console.log("data",data);
this.data = data;
});
console.log(this.data);
}
}
Mon fichier html pour gérer composant est:-
<div class="container">
<form (submit)="addProduct()">
<div class="form-group">
<label for="name">Product Name</label>
<input name="prodName" type="text" class="form-control" id="name" placeholder="Tshirt" [(ngModel)]="prodData.prodName">
</div>
<div class="form-group">
<label for="price">Price</label>
<input name="prodPrice" type="text" class="form-control" id="price" placeholder="1.1" [(ngModel)]="prodData.prodPrice">
</div>
<div class="form-group">
<label for="image">Price</label>
<input name="prodImage" type="text" class="form-control" id="image" placeholder="Link to image" [(ngModel)]="prodData.prodImage">
</div>
<div class="form-group">
<label for="size">Price</label>
<input name="prodSize" type="text" class="form-control" id="size" placeholder="M" [(ngModel)]="prodData.prodSize">
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>
<table class="table table-hover">
<tr>
<th>Product Name</th>
<th>Product Price</th>
<th>Product Size</th>
<th> </th>
</tr>
<tr *ngFor="let prod of data">
<td>{{ prod.prodName }}</td>
<td>{{ prod.prodPrice }}</td>
<td>{{ prod.prodSize }}</td>
<td>
<input type="button" class="btn btn-danger" routerLink="/reload" (click) = "delFunc(prod._id)" class="del-btn" value="Delete">
</td>
</tr>
</table>
</div>
app.le module.ts en cas de vous avez besoin de:-
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
import { HttpModule } from '@angular/http';
import { FormsModule } from '@angular/forms';
import { RouterModule, Routes } from '@angular/router';
import { AllService } from './all.service';
import {AuthGuardService} from './auth-guard.service';
import {AuthenticationService} from './authentication.service';
import { ProductManageService } from './product-manage.service';
import { AppComponent } from './app.component';
import { FrontComponent } from './front/front.component';
import { ContentComponent } from './content/content.component';
import { ProductDetailComponent } from './product-detail/product-detail.component';
import { RegisterComponent } from './register/register.component';
import { LoginComponent } from './login/login.component';
import { ProfileComponent } from './profile/profile.component';
import { ManageProductComponent } from './manage-product/manage-product.component';
const routes = [
{
path: '',
component: ContentComponent
},
{
path: 'product',
component: ProductDetailComponent
},
{
path: 'login',
component: LoginComponent
},
{
path: 'register',
component: RegisterComponent
},
{
path: 'profile',
component: ProfileComponent,
canActivate: [AuthGuardService]
},
{
path: 'manage',
component: ManageProductComponent,
},
{ path: 'reload',
redirectTo: 'manage',
pathMatch: 'full'
},
];
@NgModule({
declarations: [
AppComponent,
FrontComponent,
ContentComponent,
ProductDetailComponent,
RegisterComponent,
LoginComponent,
ProfileComponent,
ManageProductComponent
],
imports: [
BrowserModule,
FormsModule,
HttpClientModule,
HttpModule,
RouterModule.forRoot(routes, {
onSameUrlNavigation: 'reload'
}),
],
providers: [
AllService,
AuthenticationService,
AuthGuardService,
ProductManageService
],
bootstrap: [AppComponent],
exports: [RouterModule]
})
export class AppModule { }
- Pourriez-vous recharger la liste des produits après la commande de suppression terminée?
this.allService.getAlldata()
- Oui je peux l'obtenir de nouveau.
- C'est ce que j'ai fait. il a travaillé.
Vous devez vous connecter pour publier un commentaire.
Cause
Votre table n'est pas mise à jour car le modèle (
data
) n'a pas été mis à jour après l'appel d'API. Il ya quelques façons de mettre à jour le modèle, et je vous conseille de les Options 3 ou 2 dans cette réponse.Option 1
Comme certains l'ont déjà dit, la première façon de le faire est de supprimer l'élément du tableau à la vue-modèle:
L'inconvénient de cette approche est que même si l'article a été supprimé dans le frontend, comment pouvez-vous être sûr qu'il a en effet été supprimé avec succès de la base de données dans le backend? Sens, l'article serait supprimé de votre frontend HTML table, même si
this.add.deleteProd(id)
ne fonctionne pas correctement et que l'objet n'était pas réellement supprimés dans le backend. Par conséquent, vous ne pouvez pas être sûr si le frontend Vue de représenter fidèlement la réalité de l'arrière-plan.Option 2
La deuxième façon est de "recharger" la table en interrogeant le backend de nouveau. Ce qui prend le moins de travail", comme tout ce que vous avez à faire est de simplement appeler la fonction pour charger les données à nouveau:
Ici, vous gagnez de la "précision" de la réalité, mais sacrifier la performance que vous faites deux appels de REPOS à chaque fois que vous supprimez.
Option 3
La troisième voie prend le "plus de travail", mais offre un compromis entre la précision de la réalité et de la performance. Fondamentalement, vous aurez besoin de ré-écrire le backend tels que après avoir fait la base de données la suppression, le backend de REPOS/méthode de l'API renvoie le nouvel ensemble de données qui est maintenant dans la base de données.
Ensuite, vous pouvez faire quelque chose comme ceci dans votre Angulaire de la composante:
Cela suppose que vous avez le contrôle sur le backend de code. Vous pourriez avoir à faire
this.data = newData.json();
au lieu de cela, selon ce que lethis.add.deleteProd(id)
méthode retourne.Choisir l'option qui convient le mieux à votre situation. Laissez-moi savoir si cela fonctionne pour vous.
Modèle Côté
Côté Composants :
Vous n'avez pas besoin pour naviguer, vous devez supprimer le supprimé produit à partir de vos données qui est utilisée pour créer votre modèle.
Vous pouvez bien sûr de déclenchement de vos données pour recharger et de nouveau appel à votre back-end, ce serait sous-optimal.
Changer votre événement click pour passer dans l'ensemble de l'objet:
Et votre delFunc comme:
Vous pouvez supprimer le produit de cette.les données via un index.
Vous changer de code:
HTML
....
....
.ts