Как получить доступ к родительскому контейнеру именования Composite?
У меня есть JSP 2.0 <ui:component>
внутри это <p:dataTable>
со столбцом, который использует Composite для визуализации специальной рамки для некоторого контента. Теперь мне нужно определить <p:dataTabe>
в отображаемом атрибуте ajax, который находится в содержимом.
<ui:component>
<p:dataTable id="dataTable" var="userItem" ... />
<p:column>
<my:borderBox id="borderBox">
<p:commandButton
action="#{userController.doDelete(userItem.id)}"
value="delete"
update="?????"/> <!-- How to address the dateTable? -->
</my:borderBox>
</p:column>
</p:dataTable>
<ui:component>
Мой BorderBox:
<html xmlns:composite="http://java.sun.com/jsf/composite" ...>
<composite:interface>
<composite:attribute name="styleClass" default="" type="java.lang.String"/>
</composite:interface>
<composite:implementation>
<h:panelGroup ...>
...
<composite:insertChildren/>
</h:panelGroup>
</composite:implementation>
Моя идея заключалась в том, чтобы использовать что-то вроде
update=":#{component.namingContainer.parent.namingContainer.clientId}:dateTable
Но component.namingContainer.parent
швы должны быть нулевыми.
Когда я заменяю <p:commandButton>
с этими заявлениями:
Parent ClientId 1: #{component}
Parent ClientId 2: #{component.namingContainer}
Parent ClientId 3: #{component.namingContainer.clientId}
Parent ClientId 4: #{component.namingContainer.parent}
Parent ClientId 5: #{component.namingContainer.parent.namingContainer}
Я получаю этот вывод:
Parent ClientId 1: javax.faces.component.html.HtmlPanelGroup@3d957419
Parent ClientId 2: javax.faces.component.UINamingContainer@23db9e8f
Parent ClientId 3: main_form:profilTabView:dataTable:0:borderBox
Parent ClientId 4:
Parent ClientId 5:
Я понятия не имею, в чем проблема: возможно, моя идея идентифицировать список совершенно неверна или есть какая-то ошибка, или есть лучший способ? (Но я не могу использовать фиксированный абсолютный идентификатор для dateTable!)
Версии: Primeface 3.2, Мохарра 2.1.6 на Glassfish 3.1.2
1 ответ
У меня есть обходной путь для этой проблемы. Если вы не можете найти другое решение, вы можете использовать его в качестве альтернативы. Решение представляет собой смесь между JSF и Javascript. Для вашей таблицы вы определяете виджет (например, "myTable").
<p:dataTable id="dataTable" var="userItem" ... widgetVar="myTable"/>
Это глобальная переменная javascript с именем "myTable". этот объект виджета содержит идентификатор. Для вашей командной кнопки (h:commandButton, а не p:commandButton) вы определяете событие onklick:
<h:commandButton id="deleteItem" action="#{userController.doDelete(userItem.id)}"
value="delete" onclick="PrimeFaces.ab({formId:$(this).closest('form').attr('id'),source:this.id,process:'@all',update:myTable.id});return false;" />
formId - вы вводите идентификатор формы явно или используете мою функцию Jquery
обновление - myTable.id является идентификатором таблицы (в точности оболочка div)
процесс - @all, @this, @form и т. д.