Разница между идентификатором клиента, сгенерированным component.clientId и p:component()

Я пытаюсь получить идентификатор клиента h:panelGroup, который находится в p:dataList.

Я пробовал 2 подхода:

1. Использование component.clientId, например:

<h:panelGroup id="listItem">
    <h:outputText value="#{component.clientId}" />
</h:panelGroup>

2.Использование p:component() например:

<h:panelGroup id="listItem">
    <h:outputText value="#{p:component('listItem')}" />
</h:panelGroup>

Обратите внимание, что эта группа панелей находится в списке данных. Теперь идентификаторы клиентов генерируются в обоих случаях по-разному. (1) не имеет значения «listItem», добавленного к идентификатору клиента, в то время как (2) имеет значение «listItem» в сгенерированном clientId.

Кроме того, идентификатор клиента, сгенерированный с использованием (1), отличается от идентификатора сгенерированного компонента html.

Может ли кто-нибудь пролить свет на этот вопрос, почему это так?


person Rahul Nair    schedule 12.12.2013    source источник
comment
Пожалуйста, опубликуйте реальный код. #{component:clientId} недействителен.   -  person BalusC    schedule 12.12.2013


Ответы (2)


Неявный объект EL #{component} относится к текущему компоненту, который в случае

<h:outputText value="#{component.clientId}" />

сам <h:outputText>!

Если вы собираетесь распечатать идентификатор клиента другого компонента, вам необходимо привязать экземпляр компонента к уникальной переменной в представлении с помощью binding, чтобы вы могли ссылаться на него где-либо еще в том же представлении.

<h:panelGroup id="listItem" binding="#{listItem}">
    <h:outputText value="#{listItem.clientId}" />
</h:panelGroup>

Смотрите также:

person BalusC    schedule 12.12.2013
comment
Спасибо BalusC. В итоге я использовал component.clientId. Кстати, я также заметил, что атрибут привязки у меня не работает. Как я уже упоминал в своем вопросе, у меня есть группа панелей в списке данных, и наличие атрибута привязки для группы панелей испортило представление (т.е. ничего в группе панелей не было отображено) - person Rahul Nair; 17.12.2013
comment
Это может произойти, если он не привязан к уникальной переменной, как явно указано в ответе. Ответ полный как есть (примечание: нет свойства bean-компонента!) И должен работать, если у вас нет binding="#{listItem}" где-либо еще в представлении, а также во включенных файлах или композитах и ​​т. Д. - person BalusC; 17.12.2013

В моем ответе две посылки:

  1. Класс UIPanel не реализует NamingContainer, таким образом, идентификатор <h:panelGroup> не будет заканчиваться up в клиентском идентификаторе своих дочерних элементов;
  2. #{component} разрешается текущему компоненту, в котором используется эта переменная.

В этом свете в первом фрагменте вы выводите идентификатор клиента <h:outputText>, то есть идентификатор его контейнера именования плюс разделитель плюс его автоматически сгенерированный идентификатор (обратите внимание, что вы ошиблись :, который должен быть . в вашем #{component:clientId}), а во втором фрагмент вы используете функцию EL p:component PrimeFaces, которая ищет во всем дереве компонентов компонент с идентификатором, указанным в его параметре, и возвращает клиентский идентификатор найденного компонента.

Итак, вы ищете разные компоненты: <h:outputText> в первом случае и <h:panelGroup> во втором, что и объясняет разницу в результатах.

При текущей настройке следующие выражения дадут идентичные результаты:

  • #{component.parent.clientId} и
  • #{p:component('listItem')}.
person skuntsel    schedule 12.12.2013
comment
p:component() - это не функция JSTL, а функция EL. Чтобы понять, что такое JSTL, прочитайте введение stackoverflow.com/tags/jstl/info. - person BalusC; 12.12.2013
comment
Спасибо за ваш ответ @skuntsel - person Rahul Nair; 17.12.2013