gpt4 book ai didi

jsf - 使用 ui :repeat 创建 selectBooleanCheckbox 列表

转载 作者:行者123 更新时间:2023-12-01 08:18:12 25 4
gpt4 key购买 nike

我对 create 有一个疑问 selectBooleanCheckbox使用 ui:repeat .

我有一个类(class)叫 Filter论文 fields .

class Filter {

private Boolean comissaoAdesao;
private Boolean comissaoSaque;
private Boolean comissaoSaqueAdicional;
private Boolean comissaoCompra;
private Boolean cidadeUF;
private Boolean publicidade;

// getter e setter
}

所以我想知道是否可以将这些字段链接到 selectBooleanCheckbox使用 ui:repeat .

我的方法是:
if (NullUtil.isNull(this.colunasAnalitico)) {
Map<String, Boolean> map = new TreeMap<String, Boolean>() {
{
put("Comissão adesão", filter.getComissaoAdesao());
put("Comissão saque", filter.getComissaoSaque());
put("Comissão saque adicional", filter.getComissaoSaqueAdicional());
put("Comissão compra", filter.getComissaoCompra());
put("Cidade/UF", filter.getCidadeUF());
put("Publicidade", filter.getPublicidade());
}
};
this.colunasAnalitico = new ArrayList<Entry<String, Boolean>>(map.entrySet());
}
return colunasAnalitico;

我的页面代码是:
<ui:repeat >
<p:row>
<c:set var="campo" value="bean.filter.#{colunaAnalitico.value}"/>
<p:column style="width: 2%">
<p:selectBooleanCheckbox label="#{colunaAnalitico.key}" value="#{campo}"/>
</p:column>
<p:column>
<p:outputLabel value="#{campo}"/>
</p:column>
</p:row>
</ui:repeat>

最佳答案

简单地说: View 必须与模型匹配。

在您当前的模型中,您有一堆 固定 bool 属性,而不是动态大小的数组或 bool 属性集合。 <ui:repeat>只能迭代动态大小的数组或集合。在您的模型中,您已经事先知道所有可能的 bool 属性。所以,你可以在 View 中定义它们。从技术上讲,您不需要 <ui:repeat>根本。您对 value="#{someBoolean}" 的初次尝试而不是 value="#{bean.someBoolean}"由于与解释相同的技术原因而失败 here .

给定一个示例实体

public class Filter {

private Boolean option1;
private Boolean option2;
private Boolean option3;

// ...
}

你可以这样做:
<p:panelGrid columns="2">
<p:selectBooleanCheckbox id="option1" value="#{bean.filter.option1}" />
<p:outputLabel for="option1" value="Filter option one" />

<p:selectBooleanCheckbox id="option2" value="#{bean.filter.option2}" />
<p:outputLabel for="option2" value="Filter option two" />

<p:selectBooleanCheckbox id="option3" value="#{bean.filter.option3}" />
<p:outputLabel for="option3" value="Filter option three" />
</p:panelGrid>

如果您担心非 DRY代码,只需将其全部放入可重用的 include file or perhaps even tagfile or composite服用 #{bean.filter}作为值(value)。
<my:selectFilterOptions value="#{bean.filter}" />

如果您出于某种原因担心标签值,您需要意识到它们根本不属于模型。它们属于 View ,或者至少属于资源包属性文件。

filter_option.option1 = Filter option one
filter_option.option2 = Filter option two
filter_option.option3 = Filter option three
<p:outputLabel for="option1" value="#{i18n['filter_option.option1']}" />
...
<p:outputLabel for="option2" value="#{i18n['filter_option.option2']}" />
...
<p:outputLabel for="option3" value="#{i18n['filter_option.option3']}" />

也可以看看:
  • Internationalization in JSF, when to use message-bundle and resource-bundle?


  • 从另一方面来看,该模型也很有可能只是设计得很差。一堆固定 bool 值最直接的重构方法是 enum .
    public enum FilterOption {

    OPTION1,
    OPTION2,
    OPTION3;

    }

    您可以简单地将它们保存在数组或集合中(数组更容易,因此您不需要 JSF 转换器;如果您想在 @ElementCollection 上使用 JPA @Enumerated,因此不能使用数组,请考虑 OmniFaces GenericEnumConverter )。
    public class Filter {

    private FilterOption[] options;

    // ...
    }

    您可以提供应用程序范围内的所有可用值。
    @Named
    @ApplicationScoped
    public class Data {

    public FilterOption[] getFilterOptions() {
    return FilterOption.values();
    }

    }

    您可以使用枚举名称作为键来本地化资源包属性文件中的标签。

    filter_option.OPTION1 = Filter option one
    filter_option.OPTION2 = Filter option two
    filter_option.OPTION3 = Filter option three

    所以你最终可以使用 <p:selectManyCheckbox>而不是 <p:panelGrid><p:selectBooleanCheckbox> .
    <p:selectManyCheckbox value="#{bean.filter.options}">
    <f:selectItems value="#{data.filterOptions}" var="option"
    itemValue="#{option}" itemLabel="#{i18n['filter_option.' += option]}" />
    </p:selectManyCheckbox>

    也可以看看:
  • How to use enum values in f:selectItem(s)
  • Use enum in h:selectManyCheckbox
  • How do I get selectManyCheckBox to return something other than List<String>?
  • 关于jsf - 使用 ui :repeat 创建 selectBooleanCheckbox 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33697299/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com