JSF-2 Select/Unselect 所有带有单个复选框的复选框列表

JSF-2 Select/Unselect all the list of checkboxes with single checkbox

我在 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);
    }
}

当我检查 header 列的 h:selectBooleanCheckBox 时,没有任何反应。我在这里错过了什么?我是否也必须为 "selectAll" 属性 实施 Map?

谢谢。

首先。 f:ajax 没有 actionListener,它有一个 listener。阅读文档 here. Second thing, you can use valueChangeListener on h:selectBooleanCheckbox and only there. Third, listener inside rows boxes is wrong. Basically, it looks like you need to read this topic.

现在,这是工作示例:

<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>

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

  • 数据 table 需要格式,因为你在里面执行 ajax。
  • 你在地图中的键是对象。您必须确保 equals 方法是好的。在 95% 的情况下,默认值不是,特别是如果它们是 @Entity.
  • 您必须确保地图一开始填充的是false。我使用 @PostConstruct:

    @PostConstruct
    protected void performPostConstructAction() {
        for (StandardStructure s : getAllValues()) {
            checked.put(s, false);
        }
    }
    

谢谢埃米尔!我解决了。

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