Dynamic Primefaces选项卡视图不维护selectOneMenu值

Dynamic Primefaces选项卡视图不维护selectOneMenu值,dynamic,jsf-2,primefaces,lazy-loading,required,Dynamic,Jsf 2,Primefaces,Lazy Loading,Required,嗨,我有一个primefaces选项卡看起来像这样 <!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/facele

嗨,我有一个primefaces选项卡看起来像这样

<!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>
它有一个奇怪的行为,请按照以下步骤操作:

  • 打开“选择”选项卡
  • 打开其他选项卡
  • 按两次提交
第一次按nothing(无)按常规操作,下一次按触发select(选择)所需的消息,尽管它始终有一个值


请说明是否缺少某些内容或是否存在任何解决方案,因为不幸的是,使用
dynamic=“true”
实现
p:tabView
时出现了错误。存在各种问题:但受影响最大的是组件,如
p:selectOneMenu

我在自己的项目中遇到过这个问题-选择列表中的值未提交,如果它们在另一个选项卡上处于活动状态。解决方案是-不要使用动态选项卡,只要它们不会被修复。里面有太多的bug


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

对此没有直接的解决方案,这是primefaces选项卡视图中的一个bug,我带着这个解决方法来工作

 <!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>

根据选项卡索引,这是一个条件禁用,因此为了防止选项卡视图重置该值,多么脏

但它已经有了价值。。这是您从选择中选择的值。。它应该保存在JSF视图树中,你从哪里获取价值?这没关系,我正在为问题演示做演示,这不是我的应用程序,我会更新问题,不管怎样,你在方法提交中做了什么?谢谢你的总结,它实际上充满了bug,我们从第一刻就开始使用它,我找到了一个解决办法,也许我会把它贴在这里,以供其他人参考people@Danubian-水手我们可以使用哪些事件替代方案和代码?
 <!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;
    }

}