f:ajax рендеринг, ссылающийся на итеративный компонент
У меня есть xhtml со следующей структурой:
<h:form id="frmMain2">
<f:subview id="sub1">
<ui:repeat var="vatId" value="#{someBean.suppliesKeys()}" id="rep1">
<fieldset>
<legend>vatId</legend>
<h:panelGroup id="panel">
<ui:repeat var="item" value="#{someBean.supplies[vatId]}" id="rep2">
<f:subview id="sub2">
<h:commandLink id="command">
${item}
<f:ajax
event="click"
render=":frmMain2:sub1:rep1:0:panel">
</f:ajax>
</h:commandLink>
</f:subview>
</ui:repeat>
</h:panelGroup>
</fieldset>
</ui:repeat>
</f:subview>
</h:form>
Это выполняется в портлете Websphere через портлет-мост, что означает, что я застрял с Myfaces 2.0.
Проблема, с которой я сталкиваюсь, заключается в том, что я получаю следующую ошибку:
javax.portlet.PortletException: Component with id::frmMain2:sub1:rep1:0:panel not found
Обратите внимание, что я пытаюсь сослаться на первую итерацию панели внутри рендера f:ajax (: frmMain2: sub1: rep1: 0: panel).
Если бы я ссылался на что-то еще (вне итерированной части), например:frmMain2:sub1:rep1, компонент найден и портлет работает.
Я не могу найти, как мне ссылаться на некоторые повторяющиеся компоненты в атрибуте рендеринга.
Нашел следующий пост, где эта проблема описана как решенная в более новой версии Mojarra, но Myfaces 2.2.7 не решает проблему: Как узнать идентификатор клиента компонента для обновления / рендеринга ajax? Не удается найти компонент с выражением "foo", на которое ссылается "bar"
Итак, есть ли способ ссылки на компонент, который я хочу визуализировать в f:ajax?
1 ответ
Поскольку вы хотите визуализировать только первую итерацию, вы можете создать пользовательский компонент, тег или шаблон, который инкапсулирует компоненты, для которых вы выполняете итерацию, в качестве обходного пути:
<fieldset>
<legend>vatId</legend>
<h:panelGroup id="panel">
<ui:repeat var="item" value="#{someBean.supplies[vatId]}" id="rep2">
<f:subview id="sub2">
<h:commandLink id="command">
${item}
<f:ajax
event="click"
render=":frmMain2:sub1:rep1:0:panel">
</f:ajax>
</h:commandLink>
</f:subview>
</ui:repeat>
</h:panelGroup>
</fieldset>
Тогда вы могли бы жестко кодировать первый вариант. Вот пример кода (вам определенно нужно будет это адаптировать, поскольку у меня нет всей информации о данных вашей модели):
<h:form id="frmMain2">
<f:subview id="sub1">
<custom:component id="first" items="#{someBean.supplies[hardcodedFirstKey]}">
<f:ajax event="click" render="@this" />
</custom:component>
<ui:repeat var="vatId" value="#{someBean.suppliesKeys()}" id="rep1">
<custom:component items="#{someBean.supplies[vatId]}" rendered="#{!key eq hardcodedFirstKey}">
<f:ajax event="click" render=":frmMain:sub1:first" />
</custom:component>
</ui:repeat>
</f:subview>
</h:form>