JSF: pourquoi prependId = false dans une forme?

je sais ce que prependId=false fait. Il a placé le drapeau de sorte que l'id de la forme ne prévoie pas l'id de l'enfant de forme, mais pourquoi? une raison particulière pour laquelle vous voulez ou ne voulez pas préparer id?

29
jsf
demandé sur Thang Pham 2010-10-20 00:51:05

5 réponses

d'après mon expérience, je n'utilise jamais cet attribut. Toutefois, dans certains cas, elle peut être utile.

lorsque vous utilisez Facelets, vous pouvez créer des modèles ou inclure des pages dans une autre page. Vous pouvez donc imaginer qu'une page peut être inclus dans plusieurs pages. Prenons l'exemple où les pages mères contiennent un form , avec un id différent:

Page 1 :

<h:form id="form1">
    <ui:include src="pages/my-page.xhtml"/>
    ...
</h:form>

Page 2 :

<h:form id="form2">
    <ui:include src="pages/my-page.xhtml"/>
    ...
</h:form>

maintenant, dans le my-page.xhtml , vous avez un <h:inputText id="foo"/> . Dans le premier cas, l'ID de l'entrée sera form1:foo , tandis que dans le second cas, il sera form2:foo . Cela pourrait créer des situations complexes si vous avez besoin d'un accès direct à ce composant en Javascript ou en Java (en utilisant la méthode findComponent("...") ).

si vous utilisez prependId="false" (ou sur certains composants forceId="true" ), le véritable ID être simplement foo , puis votre code sera plus simple car vous n'aurez pas de soins sur le conteneur du champ de saisie.

cependant, vous devrez utiliser cet attribut avec soin, car vous pourriez avoir une erreur d'identification dupliquée si vous utilisez cet attribut prepend trop souvent...

36
répondu romaintaz 2010-10-19 21:02:02

une situation où prependId=false est utile est dans la forme login, si vous utilisez la sécurité de printemps, parce que les ID des texts d'entrée doivent être exactement" j_username "et"j_password". Donc vous ne devriez pas mettre le id du formulaire devant eux, et utiliser prependId=false est un bon choix pour y arriver.

8
répondu choquero70 2011-12-22 19:59:15

je préfère ajouter des préendides de temps en temps pour rendre les éléments de style via leurs classes D'ID plus faciles. Par exemple, un formulaire:

<h:form id="myform" ... >
    <h:inputText id="mytext" ... />
</h:form>

vous donnerait une carte D'identité de myform:mytext . Comme le colon est réservé dans CSS, vous devez échapper à la CSS pour lire quelque chose comme #myform\:mytext { ... } que je préfère ne pas faire. Avec prependId="false" je peux utiliser juste #mytext { ... } qui est beaucoup plus simple et plus agréable à lire. Il joue aussi mieux avec les préprocesseurs CSS comme LESS ou Sass.

7
répondu Lee Theobald 2015-07-30 07:59:51

en plus de faciliter le choix des sélecteurs CSS, l'utilisation de prependId=false facilite L'utilisation de JavaScript et de jQuery pour accéder à des éléments spécifiques.

sinon, sans utiliser RichFaces, pour obtenir un elmement par id en utilisant jQuery vous devrez utiliser une séquence d'évasion laide comme:

jQuery("form-id\:element-id")
3
répondu Will Durman 2012-05-16 22:01:49

un scénario où nous devons mettre ce drapeau est dans le cas D'un contrôle Autocomplet de la bibliothèque primefaces.

j'ai dû mettre ce drapeau à false quand j'ai essayé AutoComplete control of primefaces library. Je n'ai pas pu obtenir autocomplete travailler mais après avoir mis ce drapeau, il a fonctionné très bien. Vous pouvez voir ce lien à ma question concernant ce problème

WARN [Paramètres] Paramètres: Invalid morceau ignoré. avertissement à venir dans primefaces application

2
répondu Shekhar 2017-05-23 11:54:35