2009-08-06 7 views
2

Cela semble être assez simple mais je ne le sens pas. J'ai un JSF CommandButton qui exécute une tâche côté serveur de longue durée (10-15 secondes). J'ai vu des formulaires où le contexte du bouton change après qu'il a été cliqué (l'étiquette sur le bouton change et le bouton devient désactivé jusqu'à ce que le traitement soit terminé).Désactiver commandButton dans JSF

J'utilise ICEFaces et la propriété disabled est définie sur un booléen sur le code de page sous-jacent. L'écouteur d'action lié au bouton change ce booléen pour le désactiver mais hélas, aucune modification sur le JSP.

Quelqu'un?

Répondre

4

Ce que vous pouvez faire est de changer l'état du bouton en utilisant Javascript:

<h:commandButton ... onclick="this.disabled=true"/> 



Modifier en ce qui concerne le commentaire:

Si le code précédent ne ne pas soumettre le formulaire, alors vous devez désactiver le bouton un peu de temps après le clic, pas "pendant" le clic lui-même. Vous pouvez le faire en utilisant le code suivant:

<h:commandButton ... onclick="setTimeout('this.disabled=true', 100);"/> 

Je ne sais pas si le fait d'utiliser directement le ce mot-clé dans la méthode setTimeout fonctionnera correctement. Sinon, vous pouvez utiliser une autre façon de le faire:

<h:commandButton ... onclick="disableButton(this.id);"/> 

avec la fonction Javascript suivante:

function disableButton(buttonId) { 
    setTimeout("subDisableButton(" + buttonId + ")", 100); 
} 

function subDisableButton(buttonId) { 
    var obj = document.getElementById(buttonId); 
    if (obj) { 
     obj.disabled = true; 
    } 
} 

(je suis sûr que ce code peut être améliorée, ainsi)

+0

malheureusement, avec ICEfaces, cette approche ne fonctionne pas. En fait, cela le désactive du tout. J'ai essayé de le faire surMouseUp mais cela le désactive après le premier clic ... –

+0

Et qu'en est-il de ma nouvelle réponse? – romaintaz

+0

Puis-je activer le bouton après l'avoir désactivé? –

1

Vous devrait utiliser un ice: commandButton au lieu de h: commandButton, puisqu'il possède la propriété partialSubmit, qui effectuera l'action en tant qu'appel AJAX. Cela devrait rafraîchir l'état de votre bouton, donc si la propriété sur le serveur a été définie sur false, votre bouton devrait être désactivé.

+0

+1 pour tirer parti du cadre que l'OP utilise pour résoudre le problème de manière élégante. – SplinterReality

1

faire un javascript submit(); d'abord, puis désactiver le bouton

1

similaire à la solution de romaintaz

Pour une solution spécifique Firefox, les travaux suivants (il ne fonctionne pas dans IE):

<h:commandButton ... onclick="disableButton(this.id);" />

Utilisation de la fonction Javascript :

function disableButton(buttonId) { 

    var obj = document.getElementById(buttonId); 

    if (obj) { 
     setTimeout(function(thisObj) { thisObj.disabled=true; }, 50, obj); 

    } 
} 
0

le faire après que les icefaces aient mis à jour le DOM.vous pouvez utiliser ice.onAfterUpdate(callback):

ici avec jQuery

ice.onAfterUpdate(function(){ 
    updateButtons(); 
}); 

function updateButtons(){ 
    if(!isButtonEnabled()){ 
    jQuery(".myButton").attr('disabled', true); 
    jQuery(".myButton").removeClass("iceCmdBtn").addClass("iceCmdBtn-dis"); 
    }else{ 
    jQuery(".myButton").removeAttr('disabled'); 
    jQuery(".myButton").removeClass("iceCmdBtn-dis").addClass("iceCmdBtn"); 
    } 
}