使用组件ID作为widgetVar名称

Col*_*old 10 jsf widget variable-names primefaces

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

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

例如

<p:dialog id="dlgRelConsultasRealizadas" widgetVar="dlgRelConsultasRealizadas" .../> 
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 10

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

<body>
    <div id="dlgRelConsultasRealizadas">...</div> <!-- Component ID -->
    <script>var dlgRelConsultasRealizadas = ...;</script> <!-- Widget var -->
</body>
Run Code Online (Sandbox Code Playgroud)

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

dlgRelConsultasRealizadas = document.getElementById("dlgRelConsultasRealizadas");
Run Code Online (Sandbox Code Playgroud)

这将导致所有原始窗口小部件var函数完全不可用,因为该变量dlgRelConsultasRealizadas现在引用的HTMLDivElement实例与原始窗口小部件var之类的函数不同show(),等等.

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

<p:dialog id="dlgRelConsultasRealizadas" widgetVar="w_dlgRelConsultasRealizadas" .../> 
Run Code Online (Sandbox Code Playgroud)

更新:自PrimeFaces 4.0以来,由于上述原因以及"第三方库"的"全局名称空间污染"被认为是JavaScript世界中的不良做法,因此小部件变量不再被注入全局范围.因为PF4只能通过该PF()功能使用.

换一种说法,

<p:xxx ... widgetVar="foo">
Run Code Online (Sandbox Code Playgroud)

现在不再可用foo,但仅限于PF('foo').另见Hatam Alimam关于此主题的博客:PrimeFaces widgetVar简介.