我有一个关于组件 ID 和对话框(或其他组件)小部件变量名称的简单问题。
使用组件 ID 作为同一组件的小部件变量名称是否存在问题?
例如
<p:dialog id="dlgRelConsultasRealizadas" widgetVar="dlgRelConsultasRealizadas" .../>
我有一个关于组件 ID 和对话框(或其他组件)小部件变量名称的简单问题。
使用组件 ID 作为同一组件的小部件变量名称是否存在问题?
例如
<p:dialog id="dlgRelConsultasRealizadas" widgetVar="dlgRelConsultasRealizadas" .../>
这段 JSF 基本上生成了以下 HTML(不完全是这样,但效果相同):
<body>
<div id="dlgRelConsultasRealizadas">...</div> <!-- Component ID -->
<script>var dlgRelConsultasRealizadas = ...;</script> <!-- Widget var -->
</body>
内部资源管理器对这种方法存在问题。由于一些不清楚的原因,它污染了全局 JavaScript 命名空间,变量引用所有 HTML 元素的 ID(和名称)。因此,基本上,var dlgRelConsultasRealizadas
生成的 HTML 输出是在渲染被<div>
. 就好像浏览器之后在全局范围内执行以下操作:
dlgRelConsultasRealizadas = document.getElementById("dlgRelConsultasRealizadas");
这将导致所有原始小部件 var 函数完全不可用,因为该变量dlgRelConsultasRealizadas
现在引用的HTMLDivElement
实例与原始小部件 var 不具有相同的功能,例如show()
等。
因此,建议为该值提供widgetVar
一个唯一值,该值不用作任何(生成的)HTML 元素的 ID 或名称。一种常见的做法是使用一致的标签为小部件变量名称添加前缀(或后缀)。例如w_
.
<p:dialog id="dlgRelConsultasRealizadas" widgetVar="w_dlgRelConsultasRealizadas" .../>
更新:自 PrimeFaces 4.0 以来,由于上述原因以及“第三方库”的“全局命名空间污染”在 JavaScript 世界中被认为是不好的做法,小部件变量不再注入全局范围。它们是因为 PF4 只能通过该PF()
功能使用。
换句话说,
<p:xxx ... widgetVar="foo">
现在不再提供 as foo
,而仅提供 as PF('foo')
。另请参阅 Hatam Alimam 关于该主题的博客:PrimeFaces widgetVar 简介。