Connaître la nature de l'event "change" sur vue pillbox

Request description

Bonjour,

J’essaie d’utiliser l’event “change” livré en 5.0 pour modifier un boolean en front à la modification d’une pillbox. Mon souci est que la valeur de ce boolean va dépendre de ce qu’il reste dans la pillbox : true si vide, false si au moins un élément.

Or au moment du change, j’ai l’impression que

  • la modification réelle (onRemove, onAdd) ne se fait qu’après donc je ne peux pas compter le nombre d’étiquettes restantes
  • je ne sais pas si le change est un add ou un remove donc je ne peux pas calculer le nombre d’étiquettes restantes après le change

Est-ce que je m’y prends mal ?

                p.form.onload = function(ctn, obj, params) {
                    var field = ui.getUIField(ctn, obj, "rciFloAllSubs");
                    var view = ui.getUIView(ctn, obj, "RciFloSub;rciFlosubFloId");
                    view && view.ui.change(function(e) {
                        if ($(this).find('li').length > 1)
                            field.ui.val(false);
                        else
                            field.ui.val(true);
                    });
                }

Merci !
Emmanuelle

Bonjour,

Avez vous une piste pour cette demande ?

Merci !
Emmanuelle

Bonjour,

Avez vous une piste pour cette demande ?

Merci !
Emmanuelle

Bonjour,

Cas d’usage inconnu, on va regarde le “change” de vue dans une pillbox…

Il est toujours possible de déclencher le code (le count des find li) dans un setTimeout pour qu’il soit appelé après l’autre évènement.

Effectivement le callback qui actualise la vue arrive après.
Mettre un setTimeout permettra de résoudre le pb :

p.form.onload = function(ctn, obj, params) {
   var field = ui.getUIField(ctn, obj, "rciFloAllSubs");
   var view = ui.getUIView(ctn, obj, "RciFloSub;rciFlosubFloId");
   view && view.ui.change(function(e) {
       let el = $(this);
       // after UI redraw to get li count
       setTimeout(() => field.ui.val(el.find('li').length<2), 0);
   });
}

On va voir pour le déplacer le code du controller après la callback UI…

Une autre façon de faire plus propre/métier qu’un comptage de <li> (rendering qui pourrait changer un jour en div…), c’est de passer par un event de notification front qui dit quand un objet est créé/modifié/supprimé.

Pour abonner un élément à un événement (un champ, un bouton…), il suffit de lui mettre une classe et un handler, toute mise à jour (depuis un autre panel, pillbox, modeler…) y passera.

Par exemple dans le form.onload :

$(field.ui.input).addClass("js-notify").on("ui.notify", data => {
   if (data && data.object.getName()=="MyObject")
      console.log("MyObject update type=" + data.type + " id=" + data.rowId);
});

La pillbox envoit un événement qui contient la création ou la suppression du lien NN :

ui.view.notify({
  type: "create", // or "delete"
  object: o, // created or delete NN object
  rowId: id // created or delete NN Id
});

S’il y a plusieurs personnes qui ajoutent/suppriment des NN (via pillbox ou pas) sur un même parent, chaque comptage front sera faux = il faudra de toute façon refaire la règle métier en back.

Après analyse, il y a encore un cas non géré dans ce design pattern, si on est en création du parent, les pillbox ne sont pas créées/supprimées en base mais en mémoire uniquement.

  • La notification par event décrite plus haut ne va donc pas marcher pour ce cas car il n’y a pas de création/suppression
  • Par contre on peut faire en sorte de forcer un “change” sur la vue pour ce cas, ça permettra de faire le décompte y compris en création en mémoire seule.

Il faudra mettre à jour la 5.3 quand ce sera livré car

  • il manque des appels au “change” pour ce cas de création du parent avec pillbox
  • et le change de la vue passera après que la UI ait été mise à jour

Quel est le besoin de comptage front qui devra nécessairement se refaire en back / postValidate ou preSave ?
On peut aussi imaginer un setInterval en front qui actualise un rendering en fonction du count périodique des pillboxes ?

Bonjour,
Merci beaucoup pour toutes ces pistes.

Mon besoin est simplement d’actualiser un booléen sur mon objet A : faux si pillbox vide, vrai si pillbox a au moins un élément.
J’avais mis le code en back sur la N,N initialement, mais quand on faisait un save sur l’objet A par la suite on avait une erreur “objet déjà modifié” ; et la mise à jour du booléen n’était pas effective tant qu’on n’avait pas rechargé le code.

Je voulais donc utiliser la fonctionnalité Change pour mettre à jour le booléen en front.

La méthode obj.save(false) ne modifie pas le timestamp pour ce genre de cas.

S’il n’y a rien côté UI lié au “count” (pour masquer des choses par exemple si pas de pillbox), il est préférable de ne faire que du back : au postCreate et postDelete de la NN pour actualiser le count au niveau du père.

Oui c’est ce que j’avais fait initialement, mais comme je suis en pillbox, si je fais save sur le père ensuite, j’ai une erreur.

pas de code fourni = pas reproductible.
As tu mis un false dans l’appel du save du parent comme indiqué ?

Ah non désolée, avec le false je n’ai plus de conflit, merci !

This topic was automatically closed 60 minutes after the last reply. New replies are no longer allowed.