【问题标题】:Create a list of selectBooleanCheckbox using ui:repeat使用 ui:repeat 创建一个 selectBooleanCheckbox 列表
【发布时间】:2016-02-15 07:17:13
【问题描述】:

我对使用ui:repeat 创建selectBooleanCheckbox 有一个疑问。

我有一门名为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
}

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

我的方法是:

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>

【问题讨论】:

  • &lt;ui:repeat/&gt; 将如何决定页面中有多少&lt;p:selectBooleanCheckbox&gt; 呈现?
  • this.colunasAnalitico的大小
  • 查看与&lt;ui:repeat&gt; stackoverflow.com/questions/6741573/…相关的答案
  • 但是我如何才能链接到另一个class 中的字段,因为每个label 都有一个boolean 字段。
  • &lt;ui:repeat&gt; 你必须简单地传递List 然后它会自动绑定值

标签: jsf primefaces


【解决方案1】:

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

在您当前的模型中,您有一堆固定布尔属性,而不是动态大小的数组或布尔属性集合。 &lt;ui:repeat&gt; 只能遍历动态大小的数组或集合。在您的模型中,您已经事先知道所有可能的布尔属性。因此,您可以在视图中定义它们。从技术上讲,您根本不需要&lt;ui:repeat&gt;。您最初使用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} 作为值。

<my:selectFilterOptions value="#{bean.filter}" />

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

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']}" />

另见:


从另一方面来说,模型设计很糟糕也很有可能。一堆固定布尔值最直接的重构方法是enum

public enum FilterOption {

    OPTION1,
    OPTION2,
    OPTION3;

}

您可以简单地将它们保存在数组或集合中(数组更容易,因此您不需要 JSF 转换器;如果您想在 @Enumerated 上使用 JPA @ElementCollection 并因此可以t 使用数组,考虑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

因此您最终可以使用&lt;p:selectManyCheckbox&gt; 而不是&lt;p:panelGrid&gt;&lt;p:selectBooleanCheckbox&gt;

<p:selectManyCheckbox value="#{bean.filter.options}">
    <f:selectItems value="#{data.filterOptions}" var="option"
        itemValue="#{option}" itemLabel="#{i18n['filter_option.' += option]}" />
</p:selectManyCheckbox>

另见:

【讨论】:

  • 很好,但我有一个疑问,如果我想使用布尔值来呈现或不呈现列。哪个选项会更好?
  • 不确定具体问题是什么。
  • 我问我是否使用这些布尔值在一个面板网格中呈现或列,您的解决方案将是最好的?
  • 仍然不确定具体问题是什么。正如所回答的,最好的解决方案是视图与模型匹配。只要 EL 表达式的计算结果为 boolean,您就可以检查 rendered 属性中的任何内容。另见stackoverflow.com/a/4870557
【解决方案2】:

您的用例需要的是SelectManyCheckbox

查看您的代码,您可以像这样使用它:

<p:selectManyCheckbox id="basic" value="#{yourBean.selectedCheckboxes}">
    <f:selectItems value="#{yourBean.colunaAnalitico}" var="item" itemLabel="#{item.key}" itemValue="#{item.value}" />
</p:selectManyCheckbox>

如果需要,您甚至可以发送 &lt;ui:param name="campo" value="(what you want to do with item.value that I can't understand from your code)" /&gt;...

【讨论】:

  • 我改变了答案,因为我有一个Filter 类,我将每个labelfield 链接到Filter class
【解决方案3】:

你的代码有点奇怪,看看是否符合你的要求:

<ui:repeat value="#{bean.map.entrySet().toArray()}" var="entry" >
    <p:row>
        <p:column style="width: 2%">
            <p:selectBooleanCheckbox label="#{entry.key}" value="#{bean.map[entry.key]}"/>
        </p:column>
        <p:column>
            <p:outputLabel value="#{entry.key}"/>
        </p:column>                         
    </p:row>
</ui:repeat>

bean 是您的支持 bean,map 可能是 TreeMap&lt;String, Boolean&gt;。这对我有用,所以也对你有用。

相关

【讨论】:

  • 我使用了您的示例,但布尔数组的值没有更新。
  • 您需要提交按钮,例如p:commandButton,然后这应该可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多