Получите полный префикс для компонента 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-й имеют одинаковый выход.