Primefaces TabView не поддерживает значения selectOneMenu

Привет, у меня есть вкладка Primefaces. View выглядит так

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

}

у него странное поведение, следуйте инструкциям по воспроизведению:

  • откройте вкладку «Выбор»
  • открыть другую вкладку
  • дважды нажмите «Отправить»

при первом нажатии ничего не происходит, как обычно, следующее нажатие вызывает требуемое сообщение для выбора, хотя оно всегда имеет значение

Скажите, если чего-то не хватает или есть решения


person Mohamed Wagdy Khorshid    schedule 30.06.2013    source источник


Ответы (3)


К сожалению, реализация p:tabView с dynamic="true" глючит. Существуют различные проблемы: http://code.google.com/p/primefaces/issues/list?can=2&q=tabView+dynamic&colspec=ID+Type+Status+Priority+TargetVersion+Reporter+Owner+Сводка&y=5000&cells=tiles, но больше всего страдают такие компоненты, как p:selectOneMenu.

У меня была эта проблема в моем собственном проекте - значения из списков выбора не были отправлены, если они были на другой вкладке как активные. Решение: не используйте динамические вкладки, пока они не будут исправлены. Внутри слишком много ошибок.

Еще одна вещь, которая не работает, - это обновить представление вкладки из события ajax onTabChange.

person Danubian Sailor    schedule 02.07.2013
comment
Спасибо за ваше резюме, на самом деле оно полно ошибок, мы работаем с первого момента его использования, я нашел обходной путь и, возможно, я опубликую его здесь для других людей. - person Mohamed Wagdy Khorshid; 02.07.2013
comment
@Danubian-sailor Какие альтернативные события и рабочий код мы можем использовать? - person QA_Col; 13.11.2018

Прямого решения для этого нет, это ошибка во вкладке 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" 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;
    }

}

это условно отключено в соответствии с индексом вкладки, чтобы предотвратить сброс значения вкладки, как грязно !!

person Mohamed Wagdy Khorshid    schedule 03.07.2013

Поскольку <p:selectOneMenu требуется значение для сохранения выбранного элемента.

person Mathew Rock    schedule 01.07.2013
comment
но у него уже есть значение .. это значение, которое вы выбрали из выбора .. и его следует сохранить в дереве представления JSF - person Mohamed Wagdy Khorshid; 01.07.2013
comment
И где вы фиксируете ценность? - person Mathew Rock; 01.07.2013
comment
не важно я делаю демку для изложения задачи, это не мое приложение, я все равно обновлю задачу - person Mohamed Wagdy Khorshid; 01.07.2013
comment
что вы делаете в методе submit? - person Mathew Rock; 01.07.2013