J'ai le scénario suivant: J'utilise un mat-dilog pour afficher les informations d'une carte * ngPour, dans cette carte, il y a quelques informations qui sont statiques, comme le corps d'un message, le titre et la personne qui l'a publié, mais j'ai aussi des éléments dynamiques , dans ce cas un bouton similaire. Quand quelqu'un clique sur le bouton J'aime en dehors de la boîte de dialogue (qui est une vue étendue d'une publication), le bouton J'aime devient rouge et son compteur reçoit une valeur de celui-ci + 1, si la personne clique à nouveau dessus, il devient gris et a une valeur de celui-ci - 1. Si quelqu'un ouvre la boîte de dialogue et clique sur le bouton et clique sur le bouton de fermeture, cela fonctionne bien, mais si quelqu'un clique sur le bouton J'aime puis clique sur le fond ou appuie sur "esc" les données ne sont pas renvoyées au composant parent . mon code est le suivant:
visualize(value: any) { //method that opens the dialog
if (value.link && !value.video_destaque)
window.open(value.link, "_blank");
else {
const publicationData = { //pass the data to dialog
id: value.id,
cabecalho: value.header,
corpo: value.body,
...
curtiu: value.curtiu,
classeFavorite: value.classeFavorite,
num_curtidas: value.num_curtidas,
};
const dialogRef = this.dialog.open(VisualizePublicationComponent, { //open dialog
maxHeight: '85vh',
width: '70vh',
panelClass: 'custom-dialog-container',
disableClose: true,
data: {
publicacao: publicationData
}
});
dialogRef.afterClosed().subscribe(result => {
this.post.curtiu = result.curtiu;
this.post.favoritou = result.favoritou;
this.post.num_curtidas = result.num_curtidas;
this.post.classeLike = result.classeLike;
this.post.classeFavorite = result.classeFavorite;
});
}
}
la dernière partie "dialogRef.afterClosed ..." renvoie les données au composant parent, mais cela ne fonctionne qu'avec le bouton mat-dialog-close, il semble que si vous cliquez en dehors de la boîte de dialogue, il pense que vous voulez annuler et oublier complètement les données.
comme il s'agit d'un bouton similaire, l'utilisateur veut probablement lire le message, puis l'aimer et le fermer le moyen le plus simple (en cliquant en dehors de la boîte).
Je pense que la réponse à mon problème est liée au code suivant
dialogRef.backdropClick (). subscribe (() => {
dialogRef.close ();
})
mais je ne sais pas ce qu'il me manque.
3 Réponses :
Essayez d'ajouter ce
...
constructor(public dialogRef: MatDialogRef<VisualizePublicationComponent>) { }
...
ngOnInit() {
this.dialogRef.beforeClose().subscribe(() => this.dialogRef.close(this.resultData));
}
...
Où this.resultData correspond aux données que vous souhaitez renvoyer au composant parent. J'ai essayé cela et cela fonctionne pour l'esc et le clic de fond. J'espère que cela vous aidera.
Doit-on également se désabonner de l'abonnement?
En ce qui concerne la conception des matériaux, cliquer en dehors de la boîte de dialogue équivaut à appuyer sur échapper et les deux sont équivalents à une opération d'annulation, par conséquent aucune modification des données ne doit se produire. Les utilisateurs ne s'attendraient pas à ce que les modifications soient «poussées» s'ils annulent leurs modifications.
Cela étant dit, si vous souhaitez accéder à la copie des données de la boîte de dialogue (et non au «résultat» d'une «fermeture» appropriée), vous pouvez utilisez dialogRef.componentInstance.data:
dialogRef.afterClosed().subscribe(result => {
if (!result) {
result = dialogRef.componentInstance.data;
}
this.post.curtiu = result.curtiu;
this.post.favoritou = result.favoritou;
this.post.num_curtidas = result.num_curtidas;
this.post.classeLike = result.classeLike;
this.post.classeFavorite = result.classeFavorite;
});
La réponse était un peu différente de ce à quoi je m'attendais, mon collègue m'a aidé, j'avais déjà une fonction qui ferait le contrôle du bouton similaire, cela a changé la couleur du bouton et ajouté 1 au compteur etc., ce dont j'avais besoin, c'était dans cette même fonction, d'appeler une méthode à l'intérieur d'un service qui ferait une requête http pour tout changer, la logique derrière le bouton like est maintenant faite dans le modèle, donc quand la requête http recherche le données, il renvoie un modèle qui renvoie déjà la sortie correcte, cette méthode est meilleure car elle met à jour la vue immédiatement pour la boîte de dialogue et le composant parent.
Je crois toujours qu'il existe un moyen de faire la même chose avec mat- dialog sont propriétaires, mais ce n'est pas vraiment nécessaire.
voici la fonction que j'ai mentionnée:
public likePost(consumerId, postId): any {
return this.http.put(environment.baseUrl + '/consumidor/' + consumerId + '/mensagens/mensagem/' + postId + '/curtir', {},
{observe: 'response'})
.pipe(
tap((response: any) => console.debug(JSON.stringify(response))),
catchError(this.handleError('likePost(' + consumerId + ', ' + postId + ')', []))
);
}
voici un exemple de la méthode de service: p>
public likeControl(publicacao: Publicacao) {
const resultadoCurtir = publicacao.curtir();
if (resultadoCurtir) {
this.consumerCommunicationService.likePost(this.pessoa, publicacao.id).subscribe(
response => {
if (response.status < 299) {
PostCardComponent.successMessageToast('Pronto!');
} else {
const promise = PostCardComponent.errorMessageFromResponse(response);
}
}
);
} else {
this.consumerCommunicationService.dislikePost(this.pessoa, publicacao.id).subscribe(
response => {
if (response.status < 299) {
PostCardComponent.successMessageToast('Pronto!');
} else {
const promise = PostCardComponent.errorMessageFromResponse(response);
}
}
);
}
}
c'est incomplet, il y a encore un tas de fonctions là-dedans, mais c'est l'idée principale, de cette façon mon code fonctionne mieux alors J'en ai bien l'intention et je le garde dans les bonnes pratiques et en suivant l'architecture que nous mettons en œuvre, merci pour vos réponses.
On ne sait pas comment vos fonctions likeControl et likePost sont utilisées avec la boîte de dialogue. Puisqu'il s'agit de la réponse à votre problème, les lecteurs peuvent trouver utile de savoir comment ces fonctions résolvent votre problème. Il ne devrait pas être nécessaire de faire une demande pour «tout changer» lorsque «tout» est déjà local.
likeControl est une fonction que le bouton like appelle quand on clique dessus, likePost est une fonction à l'intérieur d'un service pour communiquer avec le backend, tout n'est pas local, cette information est enregistrée dans une base de données externe