Primefaces bouton de commande des appels de méthode d'action sur l'actualisation de la page
Complètement modifié:
J'étais peut-être le mélange des problèmes et mal interprété. Après simplifier mon code, la question se simplifie en: Comment puis-je empêcher le <p:commandButton>
de l'exécution de la méthode d'action sur l'actualisation de la page (par exemple, lorsque vous appuyez sur la touche F5 à l'intérieur de la fenêtre du navigateur)?
JSF Code:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:body>
<h:form>
<h:outputText value="#{bugBean.number}" />
<h:outputText value="#{bugBean.isComplete()}" />
<p:commandButton id="entryCommand" value="add"
action="#{bugBean.increase()}" update="@form" oncomplete="#{bugBean.complete()}"/>
</h:form>
</h:body>
</html>
backing bean code:
package huhu.main.managebean;
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
@Named
@SessionScoped
public class BugBean implements Serializable {
private static final long serialVersionUID = 1L;
private int number;
private boolean isComplete = false;
public void increase(){
number++;
}
public void complete(){
isComplete = true;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public boolean isComplete() {
return isComplete;
}
public void setComplete(boolean isComplete) {
this.isComplete = isComplete;
}
}
Mise à jour:
Même si je supprime le oncomplete
des trucs comme ça un cliquez sur le <p:commandButton>
juste une fois, le compteur va jusqu'à chaque actualisation de la page.
<h:form>
<h:outputText value="#{bugBean.number}" />
<p:commandButton id="entryCommand" value="add"
action="#{bugBean.increase()}" update="@form"/>
</h:form>
- Avec "rafraîchir la page", tu veux dire qu'en appuyant sur la touche F5/Ctrl+R dans le webbrowser?
- Ouais, c'est ce que je voulais dire!
- Post le reste de votre page ici, pour donner un peu de contexte.
- Je ne comprends pas votre question. Un bouton de commande de ne pas exécuter lorsqu'une page est actualisée, il s'exécute lorsque le bouton est pressé. Pouvez-vous préciser?
- C'est pourquoi il y a un problème. La méthode EST appelée lors de l'actualisation. Encore et encore.
- Qui ne se reproduit pas sur Chrome 22 / FF 16 / IE 9. Le navigateur exactement utilisez-vous? Êtes-vous de l'actualisation de l'initiale de la requête GET ou l'ajax requête POST?
- Je suis en utilisant google Chrome 22. Je viens de cliquer sur le bouton une fois, la j'ai actualiser la page avec la touche F5.
- même avec FF 16, mais que l'on me prévient que toute action, qui a été réalisée, peut être effectuée à nouveau. yeaaaaaah, n'chrome m'avertir trop? oui il l'a fait. donc je suppose que c'est la réponse...
- mais n'est-ce pas là une façon d'empêcher que la double forme de soumission à l'actualisation sans toucher la possibilité de cliquer sur le bouton plusieurs fois sur le but?
- Sonne comme que la demande n'a pas été exécutée par ajax (de manière asynchrone), mais juste régulièrement (de façon synchrone). Cela peut se produire si vous avez
ajax="false"
dans votre vraie bouton de commande de code (ce qui n'est pas présent dans le code posté jusqu'à présent). N'avez-vous pas trop simplifier le code en question sans le tester? - En fait cette fois-ci j'ai vraiment pris vos conseils à cœur, pour créer une nouvelle xhtml-fichier et un nouveau backing bean pour être en mesure de montrer le code complet. Et c'est le cas ici. Seule modification est l'
<h:form>
(voir mise à Jour) que j'ai effacé de tous lesoncomplete
-trucs après la chute de ce problème. Ce que vous voyez est vraiment mon code complet. Et vous avez raison, la demande semble être effectuées régulièrement, comme de mon navigateur (Chrome 22) de l'actualisation du bouton s'allume en un fragment de seconde dans un arrêt-bouton qui indique que quelque chose est chargé. Je l'ai comparé avec d'autres requêtes ajax - ne pas afficher ce comportement.
Vous devez vous connecter pour publier un commentaire.
La construction manquait Ajax à l'aide en raison d'un manque de la tête de la définition qu'il semble. Dans ce cas, j'ai juste ajouté
<h:head/>
juste au-dessus de la<h:body>
-tag et tout a bien fonctionné.Merci à tous les contributeurs!
Je pense que la méthode de l'action
increase()
n'est pas appelée à chaque actualisation de la page, mais il est appelé lecomplete()
méthode au lieu de cela, et c'est probablement vous faire penser que la méthode d'action a été appelé.La
oncomplete
attribut à l'intérieur de lap:commandButton
indique une côté client action, et donc une méthode JS, et non sur un serveur d'action: la EL exécute#{bugBean.complete()}
lorsqu'il analyse sur chaque actualisation de la page.oncomplete
méthode est exécutée sur chaque actualisation de la page si le bouton n'a jamais été cliqué ou pas? Quel est leaction
méthode? Même si je supprimeroncomplete
laaction
méthode est exécutée sur l'actualisation de la page, même si je n'ai jamais cliquez sur le bouton.oncomplete
est censé exécuter un code JS lorsque la méthode de l'action est terminée. Il n'est pas censé exécuter un programme JSF backing bean méthode à tous. Toute expression EL dansonXXX
attribut est évaluée immédiatement que la page s'affiche, tout simplement parce qu'il doit être converti en code JS. Mais ce n'est d'ailleurs pas lié à votre étrange problème d'actualisation.