component.namingContainer.parent пропускает h:form

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

что-то вроде этого:

    ...
    <cc:attribute name="additionalAjaxRenderIds" type="java.lang.String"></cc:attribute>
    ...
    <h:commandLink value="test" action="#{myBean.someAction}" id="testLink" >
        <f:ajax execute="@this" render="#{cc.attrs.additionalAjaxRenderIds} "/>
    </h:commandLink>
    ...

Я использую этот cc внутри формы, которая уже находится во внешнем контейнере именования:

    <h:form id="myForm">
        ...
        <mycomp:myComponent id="myCC" additionalAjaxRenderIds=":#{component.namingContainer.parent.clientId}:myPanel" />
        <h:panelGroup id="myPanel">
            ...
        </h:panelGroup>
        ...
    </h:form>

Проблема в том, если я напишу

additionalAjaxRenderIds=":#{component.namingContainer.clientId}:myPanel"

я получаю эту ошибку:

<f:ajax> contains an unknown id ':j_idt44:myForm:myCC:myPanel' - cannot locate it in the context of the component testLink

в то время как если я использую это (+ .parent):

additionalAjaxRenderIds=":#{component.namingContainer.parent.clientId}:myPanel"

ошибка:

<f:ajax> contains an unknown id ':j_idt44:myPanel' - cannot locate it in the context of the component testLink

вместо ожидаемого идентификатора:

':j_idt44:myForm:myPanel'

так что кажется, что родительский контейнер именования моего cc - это не форма, а внешний контейнер имен

Есть ли способ: 1, получить правильного родителя (форма) 2, оценить EL, прежде чем передать его в качестве параметра (чтобы я мог передать вычисленный clientId в мой cc вместо выражения EL, поэтому компонент не будет ссылаться к тегу commandLink, но к h: форме, в которую я положил свой cc)

Я знаю, что мог бы использовать

additionalAjaxRenderIds=":#{component.namingContainer.parent.clientId}:myForm:myPanel" 

но мне не нравится это решение

Кроме того, установка для атрибута prependId формы значения false прерывает весь поиск компонента (и в результате тег ajax тоже)

1 ответ

Решение

Выражения EL не оцениваются в момент создания компонента, но в момент обращения к атрибуту. Другими словами, они являются временем выполнения, а не временем сборки. #{component} относится к текущему компоненту пользовательского интерфейса в момент вычисления выражения EL, что в вашем конкретном случае <h:commandLink>, Это объясняет другой результат.

Вам нужно подходить к этому по-другому, не используя #{component},

Например

<h:form id="myForm" binding="#{myForm}">
    ...
    <mycomp:myComponent id="myCC" additionalAjaxRenderIds=":#{myForm.clientId}:myPanel" />
    <h:panelGroup id="myPanel">
        ...
    </h:panelGroup>
    ...
</h:form>

или же

<h:form id="myForm">
    ...
    <mycomp:myComponent id="myCC" additionalAjaxRenderIds=":#{myPanel.clientId}" />
    <h:panelGroup id="myPanel" binding="#{myPanel}">
        ...
    </h:panelGroup>
    ...
</h:form>
Другие вопросы по тегам