Использование идентификатора компонента в качестве имени widgetVar

У меня есть простой вопрос об идентификаторах компонентов и имени переменной виджета (или других компонентов).

Есть ли проблема с использованием идентификатора компонента как имя переменной виджета одного и того же компонента?

например.

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

Ответы

Ответ 1

Эта часть JSF генерирует в основном следующий HTML (не совсем то, но в эффектах одно и то же):

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

У Interner Explorer проблемы с этим подходом. По какой-то непонятной причине, он загрязняет глобальное пространство имен JavaScript с помощью ссылок на ссылки на все элементы HTML по их идентификатору (и имени). Итак, в основном, var dlgRelConsultasRealizadas из сгенерированного вывода HTML после того, как рендеринг был переопределен ссылкой на элемент HTML на <div>. Как будто браузер впоследствии выполняет следующие действия в глобальной области:

dlgRelConsultasRealizadas = document.getElementById("dlgRelConsultasRealizadas");

Это приведет к тому, что все исходные функции varget var будут полностью недоступны, потому что переменная dlgRelConsultasRealizadas теперь ссылается на экземпляр HTMLDivElement, который не работает 't имеют те же функции, что и исходный виджет var, например show() и т.д.

Поэтому рекомендуется указывать widgetVar уникальное значение, которое не используется как идентификатор или имя любого (сгенерированного) элемента HTML. Общей практикой является префикс (или суффикс) имени переменной виджета с последовательной меткой. Например. w_.

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

Обновить: поскольку PrimeFaces 4.0, среди прочего, указанная выше причина, а также потому, что "глобальное загрязнение пространства имен" со стороны "сторонних библиотек" считается плохой практикой в ​​мире JavaScript, переменные виджетов больше не вводятся в глобальном масштабе. Они с тех пор, как PF4 доступен только через функцию PF().

Другими словами,

<p:xxx ... widgetVar="foo">

теперь больше не доступен как foo, но только как PF('foo'). См. Также блог Hatam Alimam на тему: Вступление в widgetVar в PrimeFaces.