使用组件ID作为widgetVar名称

时间:2013-09-30 13:41:34

标签: jsf primefaces widget variable-names

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

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

E.g。

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

1 个答案:

答案 0 :(得分:10)

这段JSF基本上生成以下HTML(不完全是这样,但效果相同):

<body>
    <div id="dlgRelConsultasRealizadas">...</div> <!-- Component ID -->
    <script>var dlgRelConsultasRealizadas = ...;</script> <!-- Widget var -->
</body>

Interner Explorer在使用此方法时遇到问题。 For some unclear reason,它通过ID(和名称)对所有HTML元素的变量引用来污染全局JavaScript命名空间。因此,基本上,生成的HTML输出中的var dlgRelConsultasRealizadas是在<div>上的HTML元素引用覆盖渲染之后。就像浏览器之后在全局范围内执行以下操作一样:

dlgRelConsultasRealizadas = document.getElementById("dlgRelConsultasRealizadas");

这将导致所有原始窗口小部件var函数完全不可用,因为变量dlgRelConsultasRealizadas现在引用HTMLDivElement实例,该实例与原始窗口小部件var具有相同的功能,如{{1等等。

因此,建议为show()提供一个唯一值,该值不用作任何(生成的)HTML元素的ID或名称。通常的做法是使用一致的标签为小部件变量名称添加前缀(或后缀)。例如。 widgetVar

w_

更新:自PrimeFaces 4.0以来,由于上述原因以及“第三方库”的“全局命名空间污染”被认为是JavaScript世界中的不良做法,因此不再注入窗口小部件变量在全球范围内。因为PF4只能通过<p:dialog id="dlgRelConsultasRealizadas" widgetVar="w_dlgRelConsultasRealizadas" .../> 功能使用。

换句话说,

PF()

现在不再可用<p:xxx ... widgetVar="foo"> ,而只能作为foo。另见Hatam Alimam关于此主题的博客:Intro to PrimeFaces widgetVar