2010-12-06 30 views
0

Je souhaite modifier la propriété "required" d'un InputText situé dans ui: repeat, mais je ne suis pas en mesure d'accéder au composant à partir du ManagedBean:Modifier les propriétés d'une entrée dans une interface utilisateur: répétez

<h:selectManyCheckbox id="required" value="#{test.required}" 
    layout="lineDirection" converter="javax.faces.Integer"> 
    <f:ajax event="change" listener="#{test.update}" /> 
    <f:selectItems value="#{test.selectable}"></f:selectItems> 
</h:selectManyCheckbox> 
<ui:repeat value="#{test.names}" var="name" id="repeat"> 
    <h:panelGrid columns="3"> 
     <h:outputLabel id="nameLabel">name:</h:outputLabel> 
     <h:inputText id="name" value="#{name}" 
      validator="#{test.validateName}" /> 
     <h:message for="name"></h:message> 
    </h:panelGrid> 
</ui:repeat> 

J'essaie d'utiliser la méthode FindComponent, mais il ne fonctionne pas:

public void update(AjaxBehaviorEvent event) { 
    for(Integer i: selectable) { 
     UIViewRoot vr = FacesContext.getCurrentInstance().getViewRoot(); 
     HtmlInputText input = (HtmlInputText)vr.findComponent("form:repeat:"+i+":name"); 
     input.setRequired(required.contains(i)); 
    } 
} 

Répondre

1

le ui:repeat ne se répète pas les composants dans la racine de vue, il répète la sortie du composant dans la sortie HTML rendue.

Il y a plusieurs façons d'y parvenir correctement. L'un d'entre eux consiste à utiliser un objet valeur à la place et à y définir la nécessité. Par exemple. un List<Item> dans lequel Item a les propriétés String name et boolean required.

<ui:repeat value="#{test.items}" var="item" id="repeat"> 
    <h:panelGrid columns="3"> 
     <h:outputLabel id="nameLabel">name:</h:outputLabel> 
     <h:inputText id="name" value="#{item.name}" required="#{item.required}" validator="#{test.validateName}" /> 
     <h:message for="name"></h:message> 
    </h:panelGrid> 
</ui:repeat> 

Il y a plus de moyens, mais depuis la version JSF que vous utilisez et l'exigence fonctionnelle est peu claire, il est seulement deviner dans quel sens est le plus applicable dans votre cas.

+0

L'exigence fonctionnelle est que lorsque vous sélectionnez un élément en cochant une case, le texte inputText correspondant doit être requis. – user532357

+0

Pensez aux données localisables, les cases à cocher seraient locales, et l'entréeTexte les données localisées pour chaque locale. Seuls les entréesTextes pour les paramètres régionaux sélectionnés doivent être requis. Par exemple, si vous voulez ajouter des titres traduits pour un livre donné, mais que vous ajoutez simplement les langues, il a été traduit. – user532357

+0

L'exigence est saine. Êtes-vous prêt à remplacer 'h: selectManyCheckbox' par un' h: selectBooleanCheckbox' dans la 1ère colonne de 'h: panelGrid'? Il est plus facile d'avoir à la fois la case à cocher et le texte d'entrée dans la même répétition. – BalusC