Primefaces TabView不维护selectOneMenu值

时间:2013-06-30 23:38:00

标签: dynamic jsf-2 primefaces lazy-loading required

嗨我有一个primefaces tabView看起来像这样

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui">
    <h:head></h:head>
    <h:body>
        <p:messages />
        <h:form id="form">
            <p:tabView dynamic="true">
                <p:tab title="Tab">
                    <p:inputText required="true" value="value"></p:inputText>
                </p:tab>
                <p:tab title="Select">
                    <p:selectOneMenu value="#{dummyController.selectedValue}" id="select" required="true" requiredMessage="Select is required">
                        <f:selectItem itemValue="1" itemLabel="asd"></f:selectItem>
                        <f:selectItem itemValue="2" itemLabel="qwe"></f:selectItem>
                        <f:selectItem itemValue="3" itemLabel="zc"></f:selectItem>
                    </p:selectOneMenu>
                    <p:message for="select" />
                </p:tab>
                <p:tab title="Tab">
                    <p:inputText required="true" value="value"></p:inputText>
                </p:tab>
            </p:tabView>
            <h:commandButton action="#{dummyController.submit}" />
        </h:form>
    </h:body>
</ui:composition>

它是控制器

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class DummyController implements Serializable {

    private static final long serialVersionUID = 1L;
    private int selectedValue;

    public void submit() {

    }

public int getSelectedValue() {
    return selectedValue;
}

public void setSelectedValue(int selectedValue) {
    this.selectedValue = selectedValue;
}

}

它有一个奇怪的行为,按照tp重现的步骤:

  • 打开“选择”标签
  • 打开其他标签
  • 按两次提交

第一次按下没有任何事情发生正常,下一次按下会触发所需的选择信息,尽管它总是有一个值

请告知是否缺少某些内容或是否有任何解决方案

3 个答案:

答案 0 :(得分:1)

不幸的是,p:tabViewdynamic="true"的实施是错误的。存在各种问题:http://code.google.com/p/primefaces/issues/list?can=2&q=tabView+dynamic&colspec=ID+Type+Status+Priority+TargetVersion+Reporter+Owner+Summary&y=5000&cells=tiles但受影响最大的是p:selectOneMenu等组件。

我在自己的项目中遇到过这个问题 - 如果选择列表中的值未在其他选项卡上显示为活动状态,则不会提交这些值。解决方案是 - 不使用动态标签,只要它们不会被修复。内有太多的错误。

另一个不起作用的是从ajax事件onTabChange更新选项卡视图。

答案 1 :(得分:1)

没有直接的解决方案,这是primefaces tabView中的一个错误,我带来了这个解决方法并且工作了

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui">
    <h:head></h:head>
    <h:body>
        <p:messages />
        <h:form id="form">
            <p:tabView dynamic="true" activeIndex="#{dummyController.activeindex}" >
                <p:tab title="Tab" id="tab1">
                    <p:inputText required="true" value="value"></p:inputText>
                </p:tab>
                <p:tab title="Select" id="selectTab">
                    <p:selectOneMenu disabled="#{dummyController.activeindex != 1}" value="#{dummyController.selectedValue}" id="select" required="true" requiredMessage="Select is required">
                        <f:selectItem itemValue="" itemLabel=""></f:selectItem>
                        <f:selectItem itemValue="1" itemLabel="asd"></f:selectItem>
                        <f:selectItem itemValue="2" itemLabel="qwe"></f:selectItem>
                        <f:selectItem itemValue="3" itemLabel="zc"></f:selectItem>
                    </p:selectOneMenu>
                    <p:message for="select" />
                </p:tab>
                <p:tab title="Tab" id="tab3">
                    <p:inputText required="true" value="value"></p:inputText>
                </p:tab>
            </p:tabView>
            <h:commandButton action="#{dummyController.submit}" />
        </h:form>
    </h:body>
</ui:composition>

和控制器:

package com.ibm.sa.kap.ui.controller;

import java.io.Serializable;

@ManagedBean
@ViewScoped
public class DummyController implements Serializable {

    private static final long serialVersionUID = 1L;

    private int selectedValue;

    private int activeindex;

    public void submit() {

    }

    public int getSelectedValue() {
        return selectedValue;
    }

    public void setSelectedValue(int selectedValue) {
        this.selectedValue = selectedValue;
    }

    public int getActiveindex() {
        return activeindex;
    }

    public void setActiveindex(int activeindex) {
        this.activeindex = activeindex;
    }

}

根据标签索引禁用条件,以防止tabview重置值,多么脏!!

答案 2 :(得分:0)

因为<p:selectOneMenu需要来保存元素选择。