2010-12-07 45 views
3

J'ai une table de données simple qui contient des champs de texte de forme dynamique. Chaque champ a un ID défini dans le bean backing, donc je voulais utiliser cet identifiant pour identifier chacun des champs h: inputText.ID d'entrée JSF ignoré à l'intérieur de h: dataTable

<h:dataTable id="fieldTable" value="#{bean.indexFields}" var="item"> 
    <h:column id="column"> 
    <h:inputText id="#{item.id}" value="#{bean.values[item.id]}" /> 
    </h:column> 
</h:dataTable> 

Lorsque je tente de voir la page JSF génère une erreur: The id attribute may not be empty.

Si j'ajoute une constante à l'attribut ID d'entrée, cela fonctionne, mais en regardant l'ID généré ID de l'élément est non inclus:

<h:inputText id="#{item.id}abc" value="#{bean.values[item.id]}" /> 

Cela génère la sortie suivante:

<table id="form:fieldTable"> 
    <tbody> 
    <tr> 
     <td><input id="form:fieldTable:0:abc" type="text" name="form:fieldTable:0:abc" title="" /></td> 
    </tr> 
    <tr> 
     <td><input id="form:fieldTable:1:abc" type="text" name="form:fieldTable:1:abc" title="" /></td> 
    </tr> 
    <tr> 
     <td><input id="form:fieldTable:2:abc" type="text" name="form:fieldTable:2:abc" title="" /></td> 
    </tr> 
    </tbody> 
</table> 

Existe-t-il un moyen d'inclure l'ID de l'élément itéré dans l'attribut ID d'entrée? Pourquoi l'ID est-il omis?

Répondre

1

Why is the ID omitted?

Parce qu'il n'y a qu'un seul composant dans l'arborescence de vue. C'est seulement sa sortie générée qui se répète. Le #{item} n'est pas disponible pendant la durée de la vue.

Pourquoi avez-vous besoin d'un ID différent? Donnez-lui simplement un identifiant fixe. JSF prendra soin de son unicité dans la sortie HTML générée. L'identifiant généré est très prévisible et vous pouvez facilement le faire en JavaScript, si c'est votre intention.

+0

C'est un bon point - je ne me soucie pas nécessairement de l'ID. Je me suis heurté à cela parce que j'utilisais ui: composition pour générer un contrôle composite, contenant une étiquette suivie d'un champ de saisie de texte. L'ID spécifié sur le contrôle composite a été utilisé pour le libellé et le champ de saisie ("# {id} Label" et "# {id}" respectivement). – Travis