f: ajax рендеринг, ссылающийся на итеративный компонент - PullRequest
0 голосов
/ 14 января 2019

У меня есть 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 render (: frmMain2: sub1: rep1: 0 : панель).

Если я ссылаюсь на что-то еще (вне итерированной части), например : frmMain2: sub1: rep1, компонент найден и портлет работает.

Я не могу найти, как ссылаться на некоторый повторяющийся компонент в атрибуте рендеринга.

Нашел следующий пост, где эта проблема описана как решенная в более новой версии Mojarra, но Myfaces 2.2.7 не решает проблему: Как узнать идентификатор клиента компонента для обновления / рендеринга ajax? Не удается найти компонент с выражением "foo", на которое ссылается "bar"

Итак, есть ли способ ссылки на компонент, который я хочу отобразить в f: ajax?

1 Ответ

0 голосов
/ 14 января 2019

Поскольку вы хотите визуализировать только первую итерацию, вы можете создать пользовательский компонент, тег или шаблон, который инкапсулирует компоненты, которые вы перебираете в качестве обходного пути:

<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>
...