2010-09-27 8 views
1

Je développe une application Java EE (JSF2 + richfaces 3.3.3 + facelets). Je veux désactiver mon h: selectOneMenu en chargeant ma page, et quand il finit le chargement (en utilisant la fonction onload()), je veux réactiver mon composant. Je quelque chose comme ceci:Comment désactiver/réactiver le composant JSF en utilisant javascript?

<ui:define name="infosHead"> 
    <script type="text/javascript"> 
     window.onload = function() { 
      document.getElementById("forme1_myform:valueCh").disabled = false; 
      alert("here"); 
     } 
    </script> 
</ui:define> 
<ui:define name="infosBody"> 
    <h:form id="forme1_myform" target="_blank"> 
    <h:selectOneMenu id="valueCh" value="#{mybean.value}" disabled="true" > 
     <f:selectItems value="#{mybean.values}" /> 
     <a4j:support event="onchange" 
       ajaxSingle="true" 
       limitToList="true"      
       reRender="id1,id2,...." 
       ignoreDupResponses="true" 
       action="#{mybean.actionme}" 
       oncomplete="getId();"/> 
     </h:selectOneMenu> 
    </h:form> 
</ui:define> 

cela fonctionne très bien. Mais mon bean ne reçoit rien (mybean.value == null). C'est comme s'il pensait que le composant est toujours désactivé.

comment puis-je faire fonctionner cela?

+0

cela a-t-il fonctionné sans la fonction? pouvez-vous poster le code du haricot? – Dejell

+0

L'activation et la désactivation du composant fonctionnent. Mais obtenir la valeur de l'élément que je sélectionne dans ma liste fonctionne bien. Quand je mets l'attribut désactivé de mon h: selectOneMenu à false, alors j'obtiens la valeur de l'élément sélectionné. – mohamida

Répondre

0

J'ai trouvé cette solution.

<ui:define name="infosHead"> 
    <script type="text/javascript"> 
     window.onload = function() { 
      updateName(false); // sets 'disabled' from true to false 
     } 
    </script> 
</ui:define> 
<ui:define name="infosBody"> 
    <h:form id="forme1_myform" target="_blank"> 
    <h:selectOneMenu id="valueCh" value="#{mybean.value}" disabled="#{mybean.render}" > 
     <f:selectItems value="#{mybean.values}" /> 
     <a4j:support event="onchange" 
       ajaxSingle="true" 
       limitToList="true"      
       reRender="id1,id2,...." 
       ignoreDupResponses="true" 
       action="#{mybean.actionme}" 
       oncomplete="getId();"/> 
     </h:selectOneMenu> 
    </h:form> 
    <a4j:form> 
     <!-- this is where it's going to reRender my component --> 
     <a4j:jsFunction name="updateName" reRender="valueCh"> 
      <a4j:actionparam name="param1" assignTo="#{mybean.render}" /> 
     </a4j:jsFunction> 
    </a4j:form> 
</ui:define> 

et c'est le contenu de MyBean:

public class MyBean implements Serializable { 

    private List<SelectItem> values; 
    private String value; 
    private Boolean render = true; // the page loads with element disabled 

    public void actionme(){...} 
    //getters & setters 
} 
4

Le problème est que vous activez votre composant uniquement du côté client. Côté serveur, ce sera toujours disabled="true". Pour que cela fonctionne, vous devez:

a. Affectez la propriété disabled de votre composant à une propriété de bean géré qui sera d'abord « vrai »

disabled="#{myController.valueChDisableStatus}"

b. À l'intérieur de votre h: insert de formulaire window.onload = callScript

c. Enfin, dans la méthode définir la propriété valueChDisableStatus false

Je ne peux pas vérifier la bonne solution, mais je crois que cela fonctionnera très bien.

0

Aucune de ces solutions n'a fonctionné pour moi. Bien que la définition de l'attribut disabled de l'élément à partir d'une valeur bean gérée a bien fonctionné, et que sa valeur via javascript a bien fonctionné, la méthode "someaction" n'est toujours pas atteinte pour "définir la propriété valueChDisableStatus" à faux ". De plus, j'ai trouvé que même si mon bean géré avait un isDisabled() et un setDisabled (valeur booléenne), la méthode setDisabled() n'était jamais appelée après l'envoi du formulaire (bien sûr), bien que isDisabled() l'ait été. J'ai donc été incapable de trouver un moyen d'utiliser ces solutions pour changer la valeur "disabledElement" des beans gérés en false.

J'ai trouvé une solution qui a travaillé pour moi mais à ce lien: http://blog.michaelscepaniak.com/jsf-you-cant-submit-a-disabled-form-element

Fondamentalement, il suggère que, par défaut tous les éléments doivent être « activés » du point de vue JSF, et que tout l'activation et la désactivation devrait être fait via Javascript. Il indique que les états du client et du serveur ne sont pas synchronisés temporairement dans cette solution ... mais cela fonctionne très bien pour mon scénario, quelle que soit l'incompatibilité temporaire.

+0

Vous et l'auteur du blog ne semble pas se rendre compte que JSF fait cela dans le cadre de la protection contre les demandes falsifiées de pirates. Voir aussi a.o. http://stackoverflow.com/q/11409823, http://stackoverflow.com/q/9000669 et # 5 de http://stackoverflow.com/q/2118656 Peut-être que c'est moins nocif dans votre cas particulier, mais c'est un trou de sécurité grave lorsque la condition dépend par exemple le rôle/groupe de l'utilisateur connecté. – BalusC

Questions connexes