Получить идентификатор родительского контейнера именования в шаблоне для атрибута render / update
У меня есть шаблон и в его определении я использую несколько форм и кнопок.
Проблема в том, что определение (определение) xhtml файла не знает иерархию компонентов.
И, например, я хочу обновить элемент "table2" в другой форме в том же файле определения.
Вставка шаблона:
<p:tabView id="nav"> <!-- nav -->
<ui:insert name="content_nav">content navigation</ui:insert>
</p:tabView>
определяет первый уровень моей иерархии "nav"
Шаблон определения:
<ui:define name="content_nav">
<h:form id="form1"> <!-- nav:form1 -->
<h:dataTable id="table1"/> <!-- nav:form1:table1 -->
<p:inputText value="#{bean.value}"/>
<p:commandButton action="..." update="nav:form2:table2"/>
</h:form>
<h:form id="form2">
<h:dataTable id="table2"/> <!-- nav:form2:table2 -->
<!-- other elements -->
</h:form>
</ui:define>
В моей части определения я не хочу знать "nav"!
Как я могу это сделать? или как я могу переместить один компонент именования вверх? или сохранить самый высокий родительский полный идентификатор в переменной?
иногда я видел что-то вроде:
update=":table2"
Но я не смог найти никакой информации об этом? В документации JavaEE 6 просто упоминаются ключевые слова @.
5 ответов
Ужасно, но это должно сработать для вас
<p:commandButton action="..." update=":#{component.namingContainer.parent.namingContainer.clientId}:form2:table2" />
Поскольку вы уже используете PrimeFaces, альтернативой является использование #{p:component(componentId)}
эта вспомогательная функция сканирует весь корень представления для компонента с заданным идентификатором, а затем возвращает свой идентификатор клиента:
<p:commandButton action="..." update=":#{p:component('table2')}" />
Некрасивый ответ хорошо работает
update=":#{component.namingContainer.parent.namingContainer.clientId}:form2:table2
в основном более полезное обновление из открытого диалога в родительский
Вы можете использовать binding
атрибут для объявления переменной EL, связанной с компонентом JSF. Затем вы можете получить доступ к абсолютному идентификатору клиента этого компонента, используя javax.faces.component.UIComponent.getClientId()
, Смотрите пример ниже:
<t:selectOneRadio
id="yourId"
layout="spread"
value="#{yourBean.value}"
binding="#{yourIdComponent}">
<f:selectItems value="#{someBean.values}" />
</t:selectOneRadio>
<h:outputText>
<t:radio for=":#{yourIdComponent.clientId}" index="0" />
</h:outputText>
В дополнение к вышеупомянутым решениям у меня была проблема, заключающаяся в том, что мне приходилось динамически генерировать обновляемые компоненты (многие из них) на основе логики на стороне сервера (с определением, возможно, сложнее обнаружить вложенность).
Таким образом, решение на стороне сервера является эквивалентом update=":#{p:component('table2')}"
1, который использует org.primefaces.util.ComponentUtils.findComponentClientId( String designId )
:
// UiPnlSubId is an enum containing all the ids used within the webapp xhtml.
// It could easily be substituted by a string list or similar.
public static String getCompListSpaced( List< UiPnlSubId > compIds ) {
if ( compIds == null || compIds.isEmpty() )
return "" ;
StringBuffer sb = new StringBuffer( ":" ) ;
for ( UiPnlSubId cid : compIds )
sb.append( ComponentUtils.findComponentClientId( cid.name() ) ).append( " " ) ;
return sb.deleteCharAt( sb.length() - 1 ).toString() ; // delete suffixed space
}
вызывается через какой-то другой метод, например ... update="#{foo.getCompListComputed( 'triggeringCompId' )}"
,
1: сначала я попытался, не слишком задумываясь, чтобы вернуться public static String getCompListSpaced0() { return ":#{p:component('table2')}" ; }
в ... update="#{foo.getCompListSpaced0()}
выражение, которое, конечно, (после размышления о том, как работает фреймворк:)) не разрешается (возвращается как есть) и может вызывать проблемы, с которыми сталкивались некоторые пользователи. Также моя среда Eclipse / JBoss Tools предложила написать :#{p.component('table2')}
("." вместо ":"), что не помогло - конечно.
Попробуй это:
<h:commandButton value="Click me">
<f:ajax event="click" render="table" />
</h:commandButton>