【问题标题】:primefaces dataTable multiple selection using List instead of Arrayprimefaces dataTable 多选使用 List 而不是 Array
【发布时间】:2012-06-07 11:16:03
【问题描述】:

我想得到这个:

<h:form id="form">

    <p:dataTable value="#{testBean.allItems}" var="item" selection="#{testBean.category.itemList}" selectionMode="multiple">
        <p:column>#{item.name}</p:column>
    </p:dataTable>

</h:form>

在哪里

@ManagedBean
public class TestBean
{
    private static List<Item> itemDB = new ArrayList<Item>();
    static
    {
        itemDB.add(new Item("zero"));
        itemDB.add(new Item("one"));
        itemDB.add(new Item("two"));
        itemDB.add(new Item("three"));
        itemDB.add(new Item("four"));
        itemDB.add(new Item("five"));
    }

    private Category category;

    @PostConstruct
    public void init()
    {
        category = new Category();
        category.setName("root");
        category.getItemList().add(itemDB.get(2));
        category.getItemList().add(itemDB.get(3));
    }

    public List<Item> getAllItems()
    {
        return itemDB;
    }

    public Category getCategory()
    {
        return category;
    }

    public void setCategory(Category category)
    {
        this.category = category;
    }
}

我认为我的选择是:

  1. 创建一种从 List 到 Array 的转换器,反之亦然,但我很头疼要让它与 ValueExpressions 一起使用...
  2. 扩展 PrimeFaces DataTable 和 DataTableRenderer,但搞清楚可能真的很痛苦

有更好的主意吗?

【问题讨论】:

    标签: arrays jsf-2 datatable primefaces multipleselection


    【解决方案1】:

    Collections-API 有一些针对这种情况的相对简单的方法。

    Item[] itemArr = itemDB.toArray(new Item[0]);
    

    itemDB = Arrays.asList(itemArr);
    

    【讨论】:

    • ...如果这是个玩笑,那就不好玩了
    • 您提到创建“一种从列表到数组的翻译器,反之亦然”让我感到困惑。所以我建议了这个。有时很难判断问题指向什么。没有双关语。
    • 再想一想:添加一个 getter 和 setter 到 Category,它接受数组并将其映射到您的 itemList。
    • 在我的情况下,类别和项目是“实体”,我无法编辑它们。我只能编辑“ManagedBean”,但我不想为每个实体中的每个列表字段编写翻译器......我想要一些通用的东西。解决方案是在 jsf2 组件中,既不在实体也不在控制器中
    【解决方案2】:

    这就是我的做法。到目前为止,我还没有对它进行大量测试,但它似乎确实有效。我认为 Primefaces 的补丁可能是更好的解决方案。

    这是我想使用的列表方法:

       public List<R> getSelectionRecordList() {
            return selectionItems;
        }
    
        public void setSelectionRecordList(List<R> selectionItems) {
            this.selectionItems = selectionItems;
        }
    

    这是我添加的用于访问该列表的两个额外数组方法。

           public R[] getSelectionRecordArray() {
               if (null == selectionItems) {
                   return null;
               }
                return (R[]) selectionItems.toArray();
            }
    
            public void setSelectionRecordArray(R[] selectionArray) {
                if (null == selectionArray || selectionArray.length == 0) {
                    selectionItems = null;
                } else {
                    selectionItems = new ArrayList<R>(selectionArray.length);
                    for (R record : selectionArray) {
                        this.selectionItems.add(record);
                    }
                }
            }
    

    【讨论】:

    • 这不是我想要的。我想要一个 透明 解决方案,或者修补 PF 或使用复合组件或任何东西。但这并不透明。
    • 为什么会有“额外的数组方法”?
    【解决方案3】:

    我已经用我自己的类扩展了 primefaces DataTable

    【讨论】:

      猜你喜欢
      • 2012-07-14
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 2015-11-28
      相关资源
      最近更新 更多