在rich:dataTable标头中实现“选择所有复选框”

时间:2012-02-22 11:09:15

标签: jsf richfaces seam facelets

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

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,所以我的问题是,如何通过上述答案实现我的功能需求?或者有其他选择吗?

3 个答案:

答案 0 :(得分:3)

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

最好是让JSF跳过valueChangeListener方法中的所有剩余阶段,直到渲染响应,以便不会覆盖更改的值。您可以通过valueChangeListener方法调用FacesContext#renderResponse()来实现此目的。

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

答案 1 :(得分:0)

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

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

还有一些东西可能会简化你的选择处理程序:我为entityquery创建了一个泛型selectablewrapper,它包含一个布尔值和来自entityquery的结果的实体。你用另一个函数包装getresultslist,返回这些包装器的列表,你有一些非常通用的东西。在eclipse中,甚至自动完成泛型也会给你正确的对象。

答案 2 :(得分:0)

你应该看看这个链接:

Select All checkbox in JSF without using Javascript

希望有帮助=) 麦克