Используя идентификатор компонента, как widgetVar имя
У меня есть простой вопрос об идентификаторах компонентов и имени переменной виджета dialog (или других компонентов).
есть ли проблема использования идентификатора компонента в качестве имени переменной виджета того же компонента?
Э. Г.
<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");
это приведет к тому, что все исходные функции виджета VAR будут полностью недоступны, потому что переменная dlgRelConsultasRealizadas
теперь ссылается на HTMLDivElement
экземпляр, который не имеет тех же функций, что и исходный виджет var, как show()
, etc.
поэтому рекомендуется дать widgetVar
уникальное значение, которое не используется в качестве ID или имя любого (генерируется) HTML-элемента. Распространенной практикой является префикс (или суффикс) имени переменной виджета с согласованной меткой. Е. Г. элемент w_
.
<p:dialog id="dlgRelConsultasRealizadas" widgetVar="w_dlgRelConsultasRealizadas" .../>
обновление: поскольку PrimeFaces 4.0, среди прочего, по вышеуказанной причине, а также потому, что "глобальное загрязнение пространства имен" "сторонними библиотеками" считается плохой практикой в мире JavaScript, переменные виджета больше не вводятся в глобальную область. Они с PF4 доступны только через PF()
функция.
другими словами,
<p:xxx ... widgetVar="foo">
теперь больше не доступен как foo
, но только PF('foo')
. Смотрите также блог Хатама Алимама на эту тему:вступление к PrimeFaces widgetVar.