在不使用Javascript的情况下选择JSF中的All复选框

时间:2010-10-15 12:07:17

标签: jsf richfaces

我正在尝试使用单个复选框选择/取消选中数据表中的所有复选框。当我试图在服务器上设置它时,我无法这样做。我一直在寻找解决方案,但无法在服务器端完成如何实现。

这是代码。

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]}">
         </h:selectBooleanCheckbox>
        </rich:column>

Java文件

// Select All and delete
 public void selectAllComponents(ValueChangeEvent event){

  // If the check all button is checked, set all the checkboxes as selected 
  if(!selectAll)
  {
   changeMap(selectedComponentIds,true);
   setSelectAll(true);
  }
  else // If the button is unchecked, unselect all the checkboxes
  { 
   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);
  }
 }

选中此复选框时,我将列表中的所有值标记为true,取消选中时,false

但页面没有正确重新加载数据。

我的方法是否正确处理问题?还是有一种有效的替代方案?

2 个答案:

答案 0 :(得分:7)

这是因为ValueChangeEvent发生在更新模型阶段之前,因此您更改的值会被覆盖。
public void selectAllComponents(ValueChangeEvent event)

中执行此操作
if (event.getPhase() != PhaseId.INVOKE_APPLICATION) {
    event.setPhase(PhaseId.INVOKE_APPLICATON);
    event.queue();
 } else {
    //do your stuff here
 }

答案 1 :(得分:1)

或者在您的代码添加原始方法中的下一行代码之前

selectAll =(Boolean)event.getNewValue();