我正在使用p:tabView
在不同标签中显示多个页面。
在其中一个标签栏中,我正在打开p:dialog
(我甚至尝试使用javascript window
),只要对话框或窗口打开,整个p:tabView
组件就会重置。
某些选项卡中的ManagedBeans是@ViewScoped
,因此它成为范围相关的巨大问题。
在下面的代码中,我只是用尽可能少的代码重新创建场景(我的ManagedBeans和Xhtmls比下面的代码更大)。
如果您遇到同样的问题,请提供解决此问题的任何解决方案或解决方法。
的index.xhtml
<h:body>
<h:form>
<p:tabView dynamic="true">
<p:tab title="Tab1">
<ui:include src="tab1.xhtml"/>
</p:tab>
<p:tab title="Tab2">
<ui:include src="tab2.xhtml"/>
</p:tab>
</p:tabView>
</h:form>
</h:body>
tab1.xhtml
<h:body>
<h:form>
<h:outputLabel value="#{tab1Bean.tab1BeanString}"/>
</h:form>
</h:body>
tab2.xhtml
<h:body>
<h:form>
<h:inputText value="#{tab2Bean.tab2BeanString}">
<p:ajax event="keyup"/>
</h:inputText>
<p:button onclick="dlg.show()"/>
</h:form>
<p:dialog widgetVar="dlg" appendToBody="true">
<ui:include src="popup.xhtml"/>
</p:dialog>
</h:body>
popup.xhtml
<h:body>
<h:form>
<h:outputText value="#{tab2Bean.tab2BeanString}"/>
<h:inputText value="#{tab2Bean.popupString}">
<p:ajax event="keyup"/>
</h:inputText>
</h:form>
</h:body>
Tab1Bean.java
@ManagedBean
@ViewScoped
public class Tab1Bean implements Serializable{
private String tab1BeanString="default String";
@PostConstruct
public void init(){
System.out.println("Tab1 Bean PostConstruct");
}
public Tab1Bean() {
System.out.println("Tab1 Bean Constructor");
}
public String getTab1BeanString() {
return tab1BeanString;
}
public void setTab1BeanString(String tab1BeanString) {
this.tab1BeanString = tab1BeanString;
}
}
Tab2Bean.java
@ManagedBean
@SessionScoped
public class Tab2Bean implements Serializable {
private String tab2BeanString;
private String popupString;
@PostConstruct
public void init(){
System.out.println("Tab2 Bean @PostConstruct");
}
public Tab2Bean() {
System.out.println("Tab2 Bean Constructor");
}
public String getTab2BeanString() {
return tab2BeanString;
}
public void setTab2BeanString(String tab2BeanString) {
this.tab2BeanString = tab2BeanString;
}
public String getPopupString() {
return popupString;
}
public void setPopupString(String popupString) {
this.popupString = popupString;
}
}
使用:Primefaces 3.5和Mojarra 2.1
答案 0 :(得分:1)
p:tabView
组件未重置,只是导航到第一个标签页
由于您的Tab1Bean位于@ViewScope
,因此它再次调用@PostConstruct
和Constructors
。
使用p:tabView
的Clisntside javascript函数打开窗口后,使用与选定选项卡相同的选项卡:
(PrimeFaces.widget.TabView).select(index)