I'm new in Primefaces but I really enjoying it. As newbie I'm facing some troubles but this one I'm posting about wasted too many hours and finally my patience .
I have a menu with links that open a new tab in a tabview component. New tab content is a xhtml file. I have a selector that allows me to choose a item and only one tab, so I'm using the xhtml as "template" (only a tab for each selector item).
For example:
Selected: Item1; tabs: Tab1, Tab2
Selected: Item2; tabs: Tab1, Tab3, Tab4
Having a tabview:
|Tab1|Tab2|Tab1|Tab3|Tab4|
This is xhtml code:
Code: Select all
<h:form id="tabViewForm">
<p:growl id="tabViewGrowl" showDetail="true" />
<p:tabView id="tabView" dynamic="true" cache="false"
rendered="true" binding="#{testbinding.tabView}" >
<p:ajax event="tabChange" listener="#{testbinding.onTabChange}" />
<p:ajax event="tabClose" listener="#{testbinding.onTabClose}" />
<c:forEach var="tab" items="#{testbinding.tabs}" varStatus="loop">
<p:tab title="Tab - #{tab.tabName}" closable="true"
disabled="#{tab.tabDisabled}">
<p:fragment id="tabContentWrapper">
<ui:include src="#{tab.tabURL}"></ui:include>
</p:fragment>
</p:tab>
</c:forEach>
</p:tabView>
</h:form>
Code: Select all
private TabView tabView;
private List<Tab> tabs;
@PostConstruct
private void init() {
tabView = new TabView();
tabs = new LinkedList<Tab>();
}
Getter and setter for tabs and tabView
...
public void addTab1() {
tabs.add(new Tab("TAB_1", "Pestaña 1", "/content/tabs/tab1.xhtml", false));
PrimeFaces.current().ajax().update(tabView.getClientId()); <--- when I have the binding of the tabView
// PrimeFaces.current().ajax().update("tabViewForm:tabView"); <--- when I not have the binding
log.info("TABVIEW: getChildren(): " + tabView.getChildren() + " size: " + tabView.getChildCount()
+ " clientId: " + tabView.getClientId());
log.info("TABS: " + tabs + " size: " + tabs.size());
}
Rest of the tabs methods...
When using the binding I have console messages telling that the components already exists
Code: Select all
java.lang.IllegalStateException: El ID del componente tabViewForm:tabView:j_idt70 ya se ha encontrado en la vista.
translated: java.lang.IllegalStateException: The ID of the tabViewForm component: tabView: j_idt70 has already been found in the view.
at com.sun.faces.util.Util.checkIdUniqueness(Util.java:1026)
at com.sun.faces.util.Util.checkIdUniqueness(Util.java:1010)
at com.sun.faces.util.Util.checkIdUniqueness(Util.java:1010)
at com.sun.faces.util.Util.checkIdUniqueness(Util.java:1010)
at com.sun.faces.util.Util.checkIdUniqueness(Util.java:1010)
at com.sun.faces.application.view.FaceletPartialStateManagementStrategy.saveView(FaceletPartialStateManagementStrategy.java:460)
at com.sun.faces.application.StateManagerImpl.saveView(StateManagerImpl.java:89)
at com.sun.faces.application.view.WriteBehindStateWriter.getState(WriteBehindStateWriter.java:327)
at com.sun.faces.application.view.WriteBehindStateWriter.flushToWriter(WriteBehindStateWriter.java:221)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:475)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:134)
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
....
What I want is to control the TabView object from the code (to select active tab when I create dynamically one new, for example)
Why when I do the bind this kind of problem appears and how can I solve it?
I'm using latest 6.2 snapshot but I also had the problem with 6.1 version. It's running on a JBOSS 7.0.0 EAP server.
Thanks you very much in advance.
Nestor Almeida.