JSF-2使用单个复选框选中/取消选中所有复选框列表

时间:2016-08-24 04:16:39

标签: checkbox richfaces jsf-2.2

我在rich:dataTable中有复选框列表,我想用header列中的一个复选框一次检查所有框。

<rich:column id="includeInWHMapping" >
      <f:facet name="header">
        <h:selectBooleanCheckbox value="#{checkallbox.selectAll}">
           <f:ajax actionListener="#{checkallbox.selectAllBox}" render="selectedForWHProcess" />
        </h:selectBooleanCheckbox>  
      </f:facet>        
      <h:selectBooleanCheckbox id="selectedForWHProcess" value="#{checkallbox.checked[data]}">      
         <f:ajax actionListener="#{checkallbox.selectAllRows}"/>
      </h:selectBooleanCheckbox></rich:column>

checkallbox Bean中的代码:

private Map<StandardStructure, Boolean> checked = new HashMap<StandardStructure, Boolean>();        
private boolean selectAll;

public boolean isSelectAll() {
    return selectAll;
}

public void setSelectAll(boolean selectAll) {
    this.selectAll = selectAll;
}

public Map<StandardStructure, Boolean> getChecked() {
    return checked;
}

public void setChecked(Map<StandardStructure, Boolean> checked) {
    this.checked = checked;
}

public void selectAllBox(ValueChangeEvent e){
    boolean newSelectAll = (Boolean) e.getNewValue();
    Iterator<StandardStructure> keys = checked.keySet().iterator();
    while(keys.hasNext()){
        StandardStructure ss = keys.next();
        checked.put(ss, newSelectAll);
    }
}

当我检查标题列的h:selectBooleanCheckBox时,没有任何反应。我在这里错过了什么?我是否必须实施Map for&#34; selectAll&#34;财产呢?

感谢。

2 个答案:

答案 0 :(得分:0)

首先。 f:ajax没有actionListener,它有listener。阅读文档here。第二件事,您可以在valueChangeListener上使用h:selectBooleanCheckbox并且仅在那里使用<h:form> <rich:dataTable value="#{checkallbox.allValues}" var="data" id="dataTable"> <rich:column> <f:facet name="header"> <h:selectBooleanCheckbox value="#{checkallbox.selectAll}" valueChangeListener="#{checkallbox.selectAllBox}"> <f:ajax render="dataTable" /> </h:selectBooleanCheckbox> </f:facet> <h:selectBooleanCheckbox value="#{checkallbox.checked[data]}"> <f:ajax /> </h:selectBooleanCheckbox> </rich:column> <!-- other columns --> </rich:dataTable> </h:form> 。第三,监听器里面的行框是错误的。基本上,您似乎需要阅读this topic

现在,这是工作示例:

equals

您的代码可能存在其他问题(因为您只共享了一部分内容)。

  • 由于您正在执行内部的ajax,因此数据表必须处于格式状态。
  • 地图中的键是对象。您必须确保@Entity方法是好的。在95%的情况下,默认值不是,特别是如果它们是@PostConstruct
  • 您必须确保在开头填充地图为false。我使用@PostConstruct protected void performPostConstructAction() { for (StandardStructure s : getAllValues()) { checked.put(s, false); } }

    $(function() {
    
      var deliveryDatePlusOneMonth = new Date();
    deliveryDatePlusOneMonth.setMonth(deliveryDatePlusOneMonth.getMonth()+1);
    
    
    // Initialize delivery date picker
    $("#deliveryDateInputGroup").datepicker({
        minDate: deliveryDatePlusOneMonth
    });
    
    // By default, set the delivery date to actual date + 1 month
    $("#deliveryDateInputGroup").datepicker('setDate', deliveryDatePlusOneMonth);
    
    // Declare on change on delivery date to close the date picker once the user has selected a date
    $('#deliveryDateInputGroup').on('changeDate', function(ev){
        $(this).datepicker('hide');
    });
    
    });
    

答案 1 :(得分:0)

谢谢Emil!我解决了。

public void selectAllBox(){
    if(!selectAll){
        for(StandardStructure item : ssTable.getDto()){
            checked.put(item, true);
        }
    }else{
        for(StandardStructure item : ssTable.getDto()){
            checked.put(item, false);
        }
    }
}