component.namingContainer.parent пропускает h:form
Я сделал составной компонент, внутри него есть тег
что-то вроде этого:
...
<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>