【问题标题】:JSF selectManyCheckboxJSF 多选复选框
【发布时间】:2009-10-28 11:42:41
【问题描述】:

我很难使用 selectManyCheckbox。 基本上我正在做的是在 selectManyCheckbox 类型控制器中加载类别列表(使用列表或带有 convertEntity 的列表完成此操作)。我的问题是所选元素(value="#{cardListProvider.categoriesHolder.selectedCategories}")。经过一番阅读,我明白它也必须是一个列表,但是是什么样的呢?以及如何设置选定的类别?我没有将它们保存在 DB 中,但我需要使用它们在 bean 中运行一些操作!

这是我所拥有的:

    <h:selectManyCheckbox id="supportCategoryCardFilter"
value="#{cardListProvider.categoriesHolder.selectedCategories}" styleClass="greyText" required="false" >

             <s:selectItems var="filterList" value="#{cardListProvider.categoriesList}" label="#{filterList.label}" />

             <a:support id="supportCategoryCardFilter2" event="onchange"
reRender="someHolder, categoriesPanel" eventsQueue="onchange" action="#{cardListProvider.findCards(cardListProvider.categoriesHolder.selectedCategories)}" />

    </h:selectManyCheckbox>

我已经为此浪费了几个小时...有人可以帮助我吗? 谢谢

【问题讨论】:

    标签: jsf seam


    【解决方案1】:

    您可以像这样绑定到String[] 数组:

    public class CheckSelector {
      private String[] chosen;
    
      public String[] getChosen() { return chosen; }
      public void setChosen(String[] chosen) { this.chosen = chosen; }
    
      public SelectItem[] getChoices() {
        return new SelectItem[] { new SelectItem("1"), new SelectItem("2"),
            new SelectItem("3") };
      }
    }
    

    selectManyCheckbox 的值应该绑定到chosen。或者,您可以使用List

    public class CheckSelector {
      private List<String> chosen;
    
      public List<String> getChosen() { return chosen; }
    
      public void setChosen(List<String> chosen) { this.chosen = chosen; }
    
      public List<SelectItem> getChoices() {
        return Arrays.asList(new SelectItem("1"), new SelectItem("2"),
            new SelectItem("3"));
      }
    }
    

    值支持的确切规则列在javadoc

    • 如果组件附加了Converter,请使用它。
    • 如果没有,请查找ValueExpression 的值(如果有)。 ValueExpression 必须指向以下内容:
      • 基元数组(例如int[])。查找已注册的类 Converter 以获取此原始类型。
      • 对象数组(例如Integer[]String[])。为基础元素类型查找已注册的类 Converter
      • java.util.List。假设元素类型为java.lang.String,则无需转换。
    • 如果由于某种原因无法找到 Converter,则假定类型为 String 数组。

    【讨论】:

    • 感谢您的帮助!您建议的 setter 和 getter 与我正在做的类似。我已经尝试将它作为 List 并尝试了其他类型,但是由于某种原因,当我调试它时,列表总是为空......无法弄清楚这个......
    • 您是否在视图中添加了&lt;h:messages /&gt; 控件以查看是否有任何控件未通过转换/验证?
    • 我让它工作了。老实说,我无法说出确切的问题是什么!感谢您的帮助!请再问一个问题:“选择”是 List;是否可以使用 List 代替(可能使用转换器)?我认为这会更好,因为作为 List,我正在获取列表中所选类别的 id,然后必须执行操作才能获得真正的类别。再次感谢您。
    • 是的,这应该可以通过实现自定义转换器来实现:java.sun.com/javaee/5/docs/api/javax/faces/convert/… 但是您只需将查找操作移动到应用程序的另一部分 - 浏览器总是会发送服务器字符串.
    • 再次感谢您。我会查查的! :)
    【解决方案2】:

    我看到您正在使用 Seam,因此无需使用字符串或任何原始类型,您可以直接绑定到 List。您只需在您的 selectManyCheckbox 组件中添加另一个标签,它会自动执行所有操作。

    比自己做所有事情要好,请查看 Seam 文档

    http://docs.jboss.org/seam/2.2.0.GA/reference/en-US/html/controls.html#d0e28378

    【讨论】:

      猜你喜欢
      • 2012-02-11
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多