je veux tester l’exécution d’une méthode après un changement d’état :
Lorsque ma réservation passe du statut ATTENTE_VALIDATION au staut ANNULE, je veux exécuter la méthode testApresTransition.
cette méthode affiche juste un log dans la console :
CrbGdrResa.testApresTransition = function(){
console.log(“RQU test function testApresTransition”);
};
dans les logs, j’ai le résultat suivant :
Pour info, cette fonction est appelée uniquement lors de la transition d’état.
Je ne reproduis pas le problème sur le module Demo entre l’état en cours et validé de la commande.
A vérifier :
La fonction est appelée autre-part
ou il y a 2 save sur cette transition d’état.
Je ne reproduit pas non plus de double appel d’une callback de transition d’état.
On parle bien d’une transition déclenchée par un clic sur un bouton d’action standard de transition d’état (ou par un simple save après avoir changé la valeur de l’état dans la liste) ?
Vous pouvez voir que la callback testTransition ajoutée sur la transition Pending vers Validated n’est appelée qu’une fois (que ce soit par le bouton de transition d’état ou par changement du statut + save ou save+close).
Le callback de transition est bien appelé 1 fois lors du “save OK” de l’objet en testant la transition (via old et new value du champ statut). S’il est appelé 2 fois c’est qu’il y a eu 2 save, reste à savoir pourquoi.
Pouvez vous mettre une console dans le postSave pour voir quelles instances travaillent via getInstanceName() ?
pour voir si c’est bien le cas d’un double appel + et si ce n’est pas une instance non IHM (type tmp ou autre qui serait appelé ailleurs).
L’objet a-t-il un héritage ? autres hooks ? code sur le front ? contraintes particulières… ?
Existe-t-il du code ailleurs qui fasse des save/update sur cet objet ?
Procédez de manière systématique: Mettez l’ensemble du code de votre objet en commentaires à part la callback, si c’est bon (ça devrait), réactivez progressivement votre code jusqu’à trouver ce qui déclenche le double appel.
Très étrange, je ne vois pas comment c’est possible sans analyser votre code/module.
Est-ce que cette transition/action est paramétrée 2 fois même si un seul s’affiche ?
Ceci dit, si le postSave est bien appelé une fois, il faut appeler votre méthode à cet endroit et le retirer du paramétrage de la transition.
postSave: if (this.getOldStatus()=="X" && this.getStatus()=="Y")...
pour résoudre mon problème, j’ai effectivement codé le postSave et du coup ça fonctionne.
je vais essayer de creuser quand j’aurai un peu de temps. je présente l’appli demain …
En tout cas j’ai renforcé le code si jamais ça arrivait.
Par contre j’ai pu reproduire et corriger ce problème récent qui était en fait dans les couches basses d’un objet scripté dans la méthode invokeCallback.
Il faudra attendre la prochaine release, en attendant il faut laisser votre code dans le postSave.