0
votes

Comment appeler la méthode de haricot JSF à l'aide de JavaScript uniquement lorsque la page est chargée

Le problème est que la méthode de haricots arrière est appelée plusieurs fois

Eh bien, j'ai déjà lu cette réponse par @Ballusc P>

JSF est un langage côté serveur qui fonctionne sur le serveur Web sur une requête HTTP et produit un code HTML / CSS / JS qui est renvoyé avec la réponse HTTP. Toutes les expressions EL sous forme de $ {} et # {} seront exécutées sous le côté du serveur lors de la génération de la sortie HTML. JavaScript est un langage côté client qui fonctionne sur le WebBrowser et fonctionne sur l'arbre HTML DOM. L'attribut HTML OnClick doit spécifier une fonction JavaScript qui sera exécutée du côté du client sur l'événement HTML Dom de particulier. P> blockQuote>

Comment appeler JSF Backing Bean Methy Seulement lorsque OnCliquez / ONCOMPLETE / ON ... L'événement se produit et non sur la page Charger P>

Donc, je comprends que ma méthode de dos soit invoquée beaucoup fois, alors comment je peux résoudre ce problème p>

Ceci est mon dos Methode p> xxx pré>

et ceci est mon code JS P>

if(localStorage['ville'] == null || localStorage['date']==null){
        localStorage.setItem('date',new Date());
        localStorage.setItem('ville',#{villeBean.listeVilles()});
}
else{ 
  var oldDate = new Date(localStorage['date']).getTime();;
  var currentDate = new Date().getTime();
  var distance =  currentDate - oldDate ;
  var days = Math.floor(distance / (1000 * 60 * 60 * 24));
  if (days >= 15){
    localStorage.setItem('date',date);
    localStorage.setItem('ville',#{villeBean.listeVilles()});
  }
} 


3 commentaires

Jetez un coup d'œil à cette réponse Pourquoi JSF appelle getters plusieurs fois


@RICARDO Mon code de script Java Appelez la méthode de retour, le fonctionnement est que toutes les expressions EL sous forme de $ {} et # {} seront exécutées du côté serveur lors de la génération de la sortie HTML. Donc, la méthode de retour est exécutée 2 fois est comme la condition de script Java "ne fonctionne pas"


Ce n'est pas correct, votre code JavaScript n'appelle pas le haricot. Le JavaScript est rempli de la valeur de retour de l'appel de bean lorsque la page (incl. Code JavaScript) est rendu. La valeur de LISTVILLES () sera éliminée par la page rendue. Si vous n'aimez pas que les multiples appels font quelque chose comme si (valeur == null) valeur = dao.listvilles (); Valeur de retour;


3 Réponses :


1
votes

Vous pouvez utiliser le composant Backbean JSF SortieScript pour le faire, lorsque vous utilisez JSF El Inside Code, le code JavaScript est normal pour avoir plusieurs problèmes de demande, car on est statique et autre dynamique.

Vous pouvez mettre ce code JavaScript dans une JS Fichier en fonction de votre dossier de ressources / JS et appelez cette fonction à l'aide d'un haricot géré comme celui-là: P>

RequestContext.getCurrentInstance().execute("myfunction()");


0 commentaires

0
votes

Vous avez deux instance de votre el-expression # {villebean.listevilles ()} dans votre javascript qui est à la fois rendu (et ainsi invoqué) les irrégurs de votre condition JavaScript.

Changez votre script comme celui-ci afin de l'appeler une seule fois: xxx

avantage:

  • logique commerciale ( dao.listevilles () ) est invoqué une seule fois (mais il n'y a aucune garantie pour cela ...)
  • La liste potentiellement énorme est envoyée au navigateur une seule fois, réduisant ainsi les frais de transmission de données.

    jamais moins c'est une bonne idée de suivre des conseils de Ricardo et Holger de la réponse à Pourquoi JSF appelle JSF getters plusieurs fois suggérant de changer votre haricot à: xxx

    avantage:

    • logique commerciale ( dao.listevilles () ) est invoqué une seule fois pour un nombre arbitraire d'occurrences de # {villebean.listevilles ()} dans votre fichier xhtml. < / li>

      Risques:

      • Chaque occurrence de # {villebean.listevilles ()} dans votre XHTML rend toujours la liste et transmettez la liste potentiellement énorme.
      • Votre point de vue peut voir des données anciennes / obsolètes lorsque vous travaillez avec Ajax, car il s'agit d'une cache jamais invalidée dans le même point de vue.

2 commentaires

Oui, cela n'appellera qu'une seule fois, mais quand le localtrorage («date») et LocalStrorage («Ville») sont ni null, je ne veux pas que cela soit invoqué du tout, savez-vous ce que je veux dire.


@MOHAMLEDABOUZID Donc, votre question est généralement comment cache les données côté serveur JSF dans le client localStorage?



1
votes

Comme il s'est avéré que vous souhaitez réellement avoir un cache côté client dans localStorage code> et empêcher l'invocation de la logique commerciale si ce cache côté client est valide. doivent aller à la manière Ajax:

Je suggère de mettre en œuvre un JavaScript rendu conditionnellement fort> qui met à jour le stockage local uniquement si nécessaire: P>

if(localStorage['ville'] == null || localStorage['date']==null){
    document.getElementById('frmHidden:cmdDoUpdateLocalStorage').onclick();
}
else{ 
  var oldDate = new Date(localStorage['date']).getTime();;
  var currentDate = new Date().getTime();
  var distance =  currentDate - oldDate ;
  var days = Math.floor(distance / (1000 * 60 * 60 * 24));
  if (days >= 15){
    document.getElementById('frmHidden:cmdDoUpdateLocalStorage').onclick();
  }
} 


0 commentaires