Получите полный префикс для компонента clientId внутри контейнеров именования с помощью JSF 2.0
Я обновляю компонент через AJAX в JSF:
<h:form>
<h:outputLink>Click me
<f:ajax event="click" render=":messages" />
</h:outputLink>
</h:form>
<h:messages id="messages" globalOnly="true" />
Поскольку <h:messages />
находится вне <h:form />
, я должен префикс идентификатора с двоеточием (:
). Это работает.
Однако, если я поместил этот же код в компонент и включил этот компонент в свою страницу, код завершится неудачно. Причина в том, что объявление :messages
относится к корню иерархии компонентов, а компонент <h:messages />
, который я хочу обновить, действительно находится под моим пользовательским компонентом, который находится под этой страницей (поэтому местоположение имеет стиль :myComponent:messages
.
Внутри моего компонента, как я могу получить правильный префикс для компонента <h:messages />
? Я знаю, что я могу вручную назначить идентификатор моему компоненту и использовать его для префикса ссылки (например, :#{cc.attrs.id}:messages
). Однако я не знаю, на каком уровне иерархии компонентов лежит этот компонент, поэтому требуемый префикс может даже быть чем-то вроде :foo:bar:x:y:messages
.
Ответы
Ответ 1
Похоже, вы можете получить доступ к текущему префиксу через неявные объекты Expression Language (EL) (cc
и component
):
-
cc.clientId
возвращает текущий префикс составного компонента
-
component.clientId
возвращает префикс для любого текущего компонента.
Например, на странице вызовите некоторый компонент через
<myComponent id="foo">
Внутри этого компонента можно получить идентификаторы клиента следующим образом:
<h:outputText id="bar">
<p>ClientId for the composite component: #{cc.clientId}</p>
<p>ClientId for current any component: #{component.clientId}</p>
</h:outputText>
Следующее должно быть напечатано как:
ClientId for the composite component: foo
ClientId for current any component: foo:bar
Я получил указатель из сообщения в блоге JSF: работа с идентификаторами компонентов (id/clientId). В нем говорится, что это новая функция для JSF 2.0. До этого нужно было программно получить идентификатор из резервной копии bean.
Ответ 2
@Туукка Мустонен, спасибо за ваш ответ.
И если нам нужен доступ к другому id из того же "места", мы могли бы использовать:
<h:outputScript name="js/my-script.js"/>
<h:form id="myForm">
<h:inputText id="aaa"
onkeyup="myJSFunction(this.id)"
value="..."
/>
<h:inputText id="bbb"
onkeyup="myJSFunction(aaa.id)"
value="..."
/>
<h:inputText id="ccc"
onkeyup="myJSFunction('#component.parent.clientId.concat(':ccc')}')"
value="..."
/>
<h:inputText id="ddd"
onkeyup="myJSFunction('#component.parent.clientId.concat(':aaa')}')"
value="..."
/>
</h:form>
Функция JavaScript:
function myJSFunction(message) {
window.alert(message)
}
Выход в диалоговое окно:
1) myForm: aaa
2) null
3) myForm: ccc
4) myForm: aaa
Примечание: так что 1-й и 3-й имеют одинаковый выход.