仅在第二次单击后选择用枚举填充的 SelectOneMenu

Selecting a SelectOneMenu populated with enum only after second click

我正在尝试使用枚举来填充 PrimeFaces selectOneMenu,但无法获取所选值。 第一次点击后,分配的值始终是post-构造函数中的值。

HTML:

<p:selectOneMenu id="periodo"
                 value="#{dashboardMB.enumDate}">
  <f:selectItems value="#{dashboardMB.enumDates}"
                 var="enumDate" 
                 itemValue="#{enumDate}"
                 itemLabel="#{enumDate.label}" />
</p:selectOneMenu>

支持 bean:

private EnumDate enumDate;

@PostConstruct
public void init() {
    enumDate = EnumDate.YEAR;
}

枚举日期:

public enum EnumData {
    EMPTY("- Select -"), DAY("Day"), WEEK("Week"), FORTNIGHT("Fortnight"), MONTH("Month"), BIMESTER("Bimester"), TRIMESTER("Trimester"), SEMESTER("Semester"), YEAR("Year");
    public String label;
    public static final EnumSet<EnumDate> all = EnumSet.of(EMPTY, DAY, WEEK, FORTNIGHT, MONTH, BIMESTER, TRIMESTER, SEMESTER, YEAR);

    private EnumDate(String label) {
        this.label = label;
    }

    public String getLabel() {
        return label;
    }
}

因此,它始终具有值 "Year"。直到再次点击发送表单的按钮。

使用 OmniFaces 转换器解决:

<p:selectOneMenu id="period"
                 converter="omnifaces.SelectItemsConverter"
                 style="width: 237px !important"
                 value="#{dashboardMB.enumDate}"
                 filter="true"
                 filterMatchMode="contains"
                 panelStyleClass="oneMenuPanel"
                 styleClass="oneMenu">
  <f:selectItems value="#{dashboardMB.enumDateArray}"
                 var="enum"
                 itemValue="#{enum}"
                 itemLabel="#{enum.label}" />
</p:selectOneMenu>

enumDateArray 属性属于 EnumDate[] 类型。它的 getter returns EnumDate.values().

将枚举转换为字符串

EnumData[] eds = EnumData.values(); String EDtoString = eds[0].name();

您可以将函数 String[] EnumDatasToString() 传递给 XHTML。

要从字符串转换为枚举,请使用

EnumData ed = EnumData.valueOf(EDToString);

最好使用omnifaces generic enum converter。与 'manually' 进行列表转换等相比,它使您的代码更简洁...