Comment puis-je afficher/cacher un composant avec JSF?

Comment puis-je afficher/cacher un composant avec JSF? Je suis en train d'essayer de faire la même chose avec l'aide de javascript, mais pas avec succès. Je ne peux pas utiliser de bibliothèques tierces.

Thanks / Abhi

20
demandé sur Abhishek Dhote 2010-09-12 14:08:34

6 réponses

généralement, vous devez obtenir une poignée pour le contrôle via son clientId . Cet exemple utilise une vue Facelets JSF2 avec une liaison request-scope pour obtenir une poignée à l'autre commande:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
  <h:head><title>Show/Hide</title></h:head>
  <h:body>
    <h:form>
      <h:button value="toggle"
               onclick="toggle('#{requestScope.foo.clientId}'); return false;" />
      <h:inputText binding="#{requestScope.foo}" id="x" style="display: block" />
    </h:form>
    <script type="text/javascript">
      function toggle(id) {
        var element = document.getElementById(id);
        if(element.style.display == 'block') {
          element.style.display = 'none';
        } else {
          element.style.display = 'block'
        }
      }
    </script>
  </h:body>
</html>

la façon exacte de faire cela dépendra de la version de JSF sur laquelle vous travaillez. Voir ce billet de blog pour les versions plus anciennes de JSF: JSF: travailler avec les identificateurs de composants .

13
répondu McDowell 2013-12-09 12:20:44

vous pouvez en fait accomplir ce sans JavaScript, en utilisant seulement l'attribut rendered de JSF, en enfermant les éléments à afficher/cacher dans un composant qui peut lui-même être rendu, comme un panelGroup, au moins dans JSF2. Par exemple, le code JSF suivant affiche ou Cache une ou deux listes déroulantes selon la valeur d'un tiers. Un événement AJAX est utilisé pour mettre à jour l'affichage:

<h:selectOneMenu value="#{workflowProcEditBean.performedBy}">
    <f:selectItem itemValue="O" itemLabel="Originator" />
    <f:selectItem itemValue="R" itemLabel="Role" />
    <f:selectItem itemValue="E" itemLabel="Employee" />
    <f:ajax event="change" execute="@this" render="perfbyselection" />
</h:selectOneMenu>
<h:panelGroup id="perfbyselection">
    <h:selectOneMenu id="performedbyroleid" value="#{workflowProcEditBean.performedByRoleID}"
                     rendered="#{workflowProcEditBean.performedBy eq 'R'}">
        <f:selectItem itemLabel="- Choose One -" itemValue="" />
        <f:selectItems value="#{workflowProcEditBean.roles}" />
    </h:selectOneMenu>
    <h:selectOneMenu id="performedbyempid" value="#{workflowProcEditBean.performedByEmpID}"
                     rendered="#{workflowProcEditBean.performedBy eq 'E'}">
        <f:selectItem itemLabel="- Choose One -" itemValue="" />
        <f:selectItems value="#{workflowProcEditBean.employees}" />
    </h:selectOneMenu>
</h:panelGroup>
55
répondu Kevin Rahe 2013-12-09 12:21:08

vous devez utiliser <h:panelGroup ...> étiquette avec l'attribut rendered . Si vous définissez true à rendu, le contenu de <h:panelGroup ...> ne sera pas affiché. Votre fichier XHTML devrait avoir quelque chose comme ceci:

<h:panelGroup rendered="#{userBean.showPassword}">
    <h:outputText id="password" value="#{userBean.password}"/>
</h:panelGroup>

UserBean.java:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean
@SessionScoped
public class UserBean implements Serializable{
    //field password and it's getter and setter
    private boolean showPassword = false;
    public boolean isShowPassword(){
        return showPassword;
    }
}
6
répondu Eugenijus S. 2013-12-09 12:21:23

utilise l'attribut" rendu " disponible sur la plupart sinon la totalité des balises de l'espace h-Nam.

<h:outputText value="Hi George" rendered="#{Person.name == 'George'}" />
3
répondu Thorbjørn Ravn Andersen 2010-09-12 11:57:03

cochez ce code ci-dessous. c'est pour le menu déroulant. Dans ce cas, si nous sélectionnons les autres, la zone de texte affichera sinon la zone de texte se cachera.

function show_txt(arg,arg1)
{
if(document.getElementById(arg).value=='other')
{
document.getElementById(arg1).style.display="block";
document.getElementById(arg).style.display="none";
}
else
{
document.getElementById(arg).style.display="block";
document.getElementById(arg1).style.display="none";
}
}
The HTML code here :

<select id="arg" onChange="show_txt('arg','arg1');">
<option>yes</option>
<option>No</option>
<option>Other</option>
</select>
<input type="text" id="arg1" style="display:none;">

ou vous pouvez consulter ce lien Cliquez ici

0
répondu Gitesh Dang 2017-05-23 11:47:22

une solution évidente serait d'utiliser javascript (qui n'est pas JSF). Pour mettre en œuvre ceci par JSF vous devez utiliser AJAX. Dans cet exemple, j'utilise un groupe de boutons radio pour afficher et masquer les deux ensemble de composants. Dans le haricot arrière, je définis un commutateur booléen.

private boolean switchComponents;

public boolean isSwitchComponents() {
    return switchComponents;
}

public void setSwitchComponents(boolean switchComponents) {
    this.switchComponents = switchComponents;
}

lorsque l'interrupteur est true, un ensemble de composants s'affiche et lorsqu'il est false, l'autre ensemble s'affiche.

 <h:selectOneRadio value="#{backbean.switchValue}">
   <f:selectItem itemLabel="showComponentSetOne" itemValue='true'/>
   <f:selectItem itemLabel="showComponentSetTwo" itemValue='false'/>
   <f:ajax event="change" execute="@this" render="componentsRoot"/>
 </h:selectOneRadio>


<H:panelGroup id="componentsRoot">
     <h:panelGroup rendered="#{backbean.switchValue}">
       <!--switchValue to be shown on switch value == true-->
     </h:panelGroup>

   <h:panelGroup rendered="#{!backbean.switchValue}">
      <!--switchValue to be shown on switch value == false-->
   </h:panelGroup>
</H:panelGroup>

Note: sur l'événement ajax nous rendons components racine. parce que les composants qui ne sont pas rendus en premier lieu ne peuvent pas être re-rendus sur l'événement ajax .

aussi, notez que si les boutons" componentsRoot " et radio sont sous une hiérarchie de composants différente. vous devez le référencer à partir de la racine (forme racine).

0
répondu NԀƎ 2018-07-21 12:23:02