Utiliser l'ID du composant comme nom widgetVar
j'ai une question simple sur les ID des composants et le nom de la variable widget (ou d'autres composants).
y a-t-il un problème d'utilisation de l'ID du composant comme nom de la variable widget du même composant?
E. G.
<p:dialog id="dlgRelConsultasRealizadas" widgetVar="dlgRelConsultasRealizadas" .../>
1 réponses
Ce morceau de JSF génère essentiellement le code HTML suivant (pas exactement, mais dans les effets de même):
<body>
<div id="dlgRelConsultasRealizadas">...</div> <!-- Component ID -->
<script>var dlgRelConsultasRealizadas = ...;</script> <!-- Widget var -->
</body>
Interner Explorer a des problèmes avec cette approche. Pour quelque obscure raison, il pollue L'espace de noms JavaScript global avec des références variables à tous les éléments HTML par leur ID (et leur nom). Donc, en gros, le var dlgRelConsultasRealizadas
de la sortie HTML générée est après que le rendu ait été dépassé par la référence de L'élément HTML sur le <div>
. C'est comme si le navigateur faisait ensuite ce qui suit dans la portée globale:
dlgRelConsultasRealizadas = document.getElementById("dlgRelConsultasRealizadas");
cela va provoquer toutes les fonctions d'origine du widget var à être complètement indisponible parce que la variable dlgRelConsultasRealizadas
fait maintenant référence à un HTMLDivElement
instance qui n'a pas les mêmes fonctions que le widget var original comme show()
, etc.
par conséquent, il est recommandé de donner le widgetVar
une valeur unique qui n'est pas utilisée comme ID ou nom d'une quelconque) L'élément HTML. Une pratique courante est de préfixer (ou Suffixe) le nom de la variable widget avec une étiquette cohérente. E. g. w_
.
<p:dialog id="dlgRelConsultasRealizadas" widgetVar="w_dlgRelConsultasRealizadas" .../>
mise à Jour: depuis PrimeFaces 4.0, Pour entre autres la raison ci-dessus et aussi parce que "global namespace pollution" par des "bibliothèques tierces" est considéré comme une mauvaise pratique dans le monde JavaScript, les variables widget ne sont plus injectées dans le champ global. Ils sont disponibles depuis PF4 uniquement via le PF()
fonction.
En d'autres termes,
<p:xxx ... widgetVar="foo">
n'est désormais plus disponible en tant que foo
, mais seulement comme PF('foo')
. Voir aussi Hatam Alimam blog sur le sujet: Intro to PrimeFaces widgetVar.