2010-10-15 50 views
3

我試圖使用單個複選框選擇/取消選中數據表中的所有複選框。正如我試圖在服務器上設置它,我無法這樣做。我已經四處尋找解決方案,但無法在服務器端完成如何完成。選擇JSF中的所有複選框而不使用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]}"> 
     </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

但是頁面沒有正確地重新載入數據。

我的方法是否正確處理問題?還是有一個有效的選擇?

+0

請參閱http://stackoverflow.com/questions/2929037/select-and-unselect-list-of-checkboxes-with-single-checkbox – Krumb 2012-04-26 16:24:05

回答

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 
} 
+0

感謝Adam,您的解決方案完美無缺。 – Abdul 2010-10-18 07:04:12

+3

正確的方法名稱是getPhaseId()和setPhaseId(),如spec http://download.oracle.com/docs/cd/E17802_01/j2ee/j2ee/javaserverfaces/1.1_01/docs/api/javax/faces/event中所述/FacesEvent.html – uthark 2011-01-15 05:43:56

1

或者只是你的代碼之前在原始方法中添加下一行代碼

全選=(布爾)event.getNewValue();

+0

沒有包括Adam在這裏的答案給出的代碼,它不適用於我:http://stackoverflow.com/questions/3942060/select-all-checkbox-in-jsf-without-using-javascript ?RQ = 1 – 2015-11-21 06:48:11