Получить полный префикс для компонента clientId внутри контейнера именования с помощью JSF 2.0 - PullRequest
15 голосов
/ 17 августа 2010

Я обновляю компонент через 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.

Ответы [ 2 ]

24 голосов
/ 17 августа 2010

Похоже, вы можете получить доступ к текущему префиксу через неявные объекты языка выражений (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. Перед этим нужно было программно получить идентификатор из поддерживающего бина.

0 голосов
/ 29 апреля 2012

@ Туукка Мустонен, спасибо за ваш ответ.

И если нам понадобится получить доступ к другому идентификатору из того же самого "места", мы могли бы использовать:

<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-й выходы одинаковы.

...