【问题标题】:Implementing "Select all checkboxes" in rich:dataTable header在 rich:dataTable 标头中实现“选择所有复选框”
【发布时间】:2025-11-26 19:40:02
【问题描述】:

我正在尝试在 Rich:dataTable 标头中实现“选择所有复选框”复选框,而不使用 JavaScript。

XHTML:

<rich:column styleClass="center-aligned-text">
    <f:facet name="header">
        <h:selectBooleanCheckbox id="selectAll" title="selectAll" valueChangeListener="#{workspace.selectAllComponents}">
            <a4j:support event="onclick" reRender="listcomponents"/>
        </h:selectBooleanCheckbox>
    </f:facet>

    <h:selectBooleanCheckbox id="selectComponent" value="#{workspace.selectedComponentIds[componentInfo.id]}" />
</rich:column>

支持 bean:

public void selectAllComponents(ValueChangeEvent event) {
    if (!selectAll) {
        changeMap(selectedComponentIds,true);
        setSelectAll(true);
    } else { 
        changeMap(selectedComponentIds,false);
        setSelectAll(false);
    }
}


public void changeMap(Map<Long,Boolean> selectedComponentMap, Boolean blnValue) {
    if(selectedComponentMap != null) {
        Iterator<Long> itr = selectedComponentMap.keySet().iterator();
        while(itr.hasNext()) {
            selectedComponentMap.put(itr.next(), blnValue);
        }
        setSelectedComponentIds(selectedComponentMap);
    }
}

我在这里找到的答案:

if (event.getPhase() != PhaseId.INVOKE_APPLICATION) {
    event.setPhase(PhaseId.INVOKE_APPLICATON);
    event.queue();
} else {
   //do your stuff here
}

没有加起来,因为getPhase()ValueChangeEvent 事件中不可用。我只看到 getPhaseId() 包含 INVOKE_APPLICATION 选项,所以我的问题是,如何通过上述答案实现我的功能要求?或者有没有其他选择?

【问题讨论】:

    标签: jsf richfaces seam facelets


    【解决方案1】:

    valueChangeListener 在流程验证阶段执行其工作。但是,在提交整个表单时,提交的值将覆盖在更新模型值阶段中valueChangeListener 更改的值。您确实希望在调用操作阶段执行“全选”作业。

    更好的是让 JSF 跳过 valueChangeListener 方法中的所有剩余阶段,直到呈现响应,这样更改的值就不会被覆盖。您可以通过在valueChangeListener 方法中调用FacesContext#renderResponse() 来实现。

    public void selectAllComponents(ValueChangeEvent event) {
        selectAll = !selectAll;
        changeMap(selectedComponentIds, selectAll);
        FacesContext.getCurrentInstance().renderResponse();
    }
    

    【讨论】:

      【解决方案2】:

      我已经在数据表的标题方面使用了一个复选框来实现这一点,但是使用一个简单的 jquery 来选择此表行中的所有复选框。

      如果您想避免使用 js,并且您可以在不刷新表格选择的情况下生活,但只需使用全选复选框本身。您可以将其映射到一个 bean 并在您的应用程序中使用 a4j 操作(侦听器)来处理它,您将在其中更新您选择的 id 并重新呈现您的表。

      还有一些东西可能会简化您的选择处理程序:我已经为实体查询创建了一个通用的可选择包装器,它包含一个布尔值和实体查询结果的实体。您将 getresultslist 与另一个返回这些包装器列表的函数包装在一起,并且您有一些非常通用的东西。在 Eclipse 中,即使是泛型的自动完成也会为您提供正确的对象。

      【讨论】:

        最近更新 更多