p:tabView从其中一个选项卡打开p:对话框后休息

时间:2013-09-10 13:54:33

标签: jsf primefaces

我正在使用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

1 个答案:

答案 0 :(得分:1)

p:tabView组件未重置,只是导航到第一个标签页 由于您的Tab1Bean位于@ViewScope,因此它再次调用@PostConstructConstructors。 使用p:tabView的Clisntside javascript函数打开窗口后,使用与选定选项卡相同的选项卡:

(PrimeFaces.widget.TabView).select(index)