12

我有一个关于组件 ID 和对话框(或其他组件)小部件变量名称的简单问题。

使用组件 ID 作为同一组件的小部件变量名称是否存在问题?

例如

<p:dialog id="dlgRelConsultasRealizadas" widgetVar="dlgRelConsultasRealizadas" .../> 
4

1 回答 1

13

这段 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 简介

于 2013-09-30T14:13:20.367 回答