Я использую Mojarra 2.2.8 и Primefaces 5.2. Мне нужно включить разные фаслеты в запрос ajax, поэтому я использую этот код в управляемом компоненте:
FaceletContext faceletContext = (FaceletContext) context.getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
if (type.equals("default")) {
faceletContext.includeFacelet(this, "/defaultDlg.xhtml");
}
В defaultDlg.xhtml у меня есть динамическая вкладка Primefaces:
<p:tabView id="contentTabView" onTabShow="PF('contentDlg').initPosition();" dynamic="true">
<p:ajax event="tabChange" listener="#{folderView.onTabChange}"/>
<p:tab title="#{msg['title.documentCard']}">
<p:panel>
<!-- some widgets here... -->
</p:panel>
</p:tab>
<p:tab title="#{msg['title.performance']}">
<!-- DataTable with subTable ... -->
<p:dataTable value="#{folderView.performance}"
id="historyTable" widgetVar="historyTable" var="wf">
<p:columnGroup type="header">
<p:row>
<p:column headerText="#{msg['audit.performance.sendbydesc']}" />
<p:column headerText="#{msg['audit.performance.performerdesc']}" />
</p:row>
</p:columnGroup>
<p:subTable var="task" value="#{wf[5]}">
<f:facet name="header">
<h:outputText value="#{wf[2]}" />
</f:facet>
<p:column>
<h:outputText value="#{task[2]}" />
</p:column>
<p:column>
<h:outputText value="#{task[4]}" />
</p:column>
</p:subTable>
</p:dataTable>
</p:tab>
<!-- more tabs ... -->
Я просмотрел этот ответ на соответствующий вопрос, где пользователь говорит, что "Использовать FaceletContext - неправильный способ сделать это, потому что позже это вызывает дублирование идентификатора и проблемы с управлением состоянием" без каких-либо объяснений. В моем примере этот метод правильно включает UIComponents из defaultDlg.xhtml для просмотра корня и отображает их на странице.
Но когда я нажимаю на вторую вкладку с подтаблицей или делаю любой запрос ajax, я получаю эту ошибку:
Я думаю, что может возникнуть проблема с сохранением состояния во время ajax-запроса, потому что, если я удалю subTable со второй вкладки, я получаю это предупреждение при каждом ajax-запросе:
Предупреждение: невозможно сохранить динамическое действие с идентификатором клиента 'ntikDoc:j_id69584408_969820d', так как невозможно найти UIComponent Предупреждение: невозможно сохранить динамическое действие с идентификатором clientId 'ntikDoc:j_id69584408_969820d_1', поскольку невозможно найти UIComponent Предупреждение: невозможно сохранить динамическое действие с идентификатором clientId ' ntikDoc:idtFrom:j_id69584408_969829e', потому что UIComponent не может быть найден Предупреждение: невозможно сохранить динамическое действие с идентификатором клиента 'ntikDoc:idtFrom:j_id69584408_96982b4', потому что UIComponent не может быть найден Предупреждение: невозможно сохранить динамическое действие с clientId 'ntikDoc:j_id69584408_96983ee', потому что UIComponent не может быть найден. Предупреждение. Невозможно сохранить динамическое действие с идентификатором clientId 'ntikDoc:idtTo:j_id69584408_9698056', так как не удается найти UIComponent. Не удалось сохранить динамическое действие с clientId 'ntikDoc:idtTo:j_id69584408_969800a ' потому что UIComponent не может быть найден Предупреждение: невозможно сохранить динамическое действие с clientId 'ntikDoc:contentTabView:j_id492561291_69346015', потому что UIComponent не может быть найден found Предупреждение: невозможно сохранить динамическое действие с clientId 'ntikDoc:contentTabView:contentTable:j_id492561291_69346b92', так как не удается найти UIComponent. : невозможно сохранить динамическое действие с идентификатором clientId 'ntikDoc:contentTabView:perTable:j_id492561291_69346cc4', так как не удается найти UIComponent. сохранить динамическое действие с clientId 'ntikDoc:contentTabView:perTable:j_id492561291_69346c10', потому что UIComponent не может быть найден. 'ntikDoc:contentTabView:historyDocTable:j_id492561291_69346ef9', потому что UIComponent не может быть найден
Итак, как правильно использовать
faceletContext.includeFacelet
?
Инструкции по правильному использованию (в бэк-бине) уже даны в ответе, который вы нашли. Ты это пробовал?
FaceletContext faceletContext = (FaceletContext) context.getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
if (type.equals("default")) {
faceletContext.includeFacelet(this, "/defaultDlg.xhtml");
}
работает правильно только во время сборки представления, но, по-видимому, вы выполнили его после построения представления (например, в методе действия bean-компонента).
<ui:include src="#{bean.src}">
, завернутого в<c:if test="#{not empty bean.src}">
, и это работает. Теперь мне просто любопытно, почему _3_ не работает. - person BalusC   schedule 17.03.2016