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>
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 Réponses :
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()");
Vous avez deux instance de votre el-expression Changez votre script comme celui-ci afin de l'appeler une seule fois: p> avantage: p> 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 à: p> avantage: p> Risques: P> # {villebean.listevilles ()} code> dans votre javascript qui est à la fois rendu (et ainsi invoqué) les irrégurs de votre condition JavaScript.
dao.listevilles () code>) est invoqué une seule fois (mais il n'y a aucune garantie pour cela ...) li>
dao.listevilles () code>) est invoqué une seule fois pour un nombre arbitraire d'occurrences de
# {villebean.listevilles ()} code> dans votre fichier xhtml. < / li>
ul>
# {villebean.listevilles ()} code> dans votre XHTML rend toujours la liste et transmettez la liste potentiellement énorme. LI>
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?
Comme il s'est avéré que vous souhaitez réellement avoir un cache côté client dans Je suggère de mettre en œuvre un JavaScript 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:
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();
}
}
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; code>