2012-02-22 66 views
2

我想實現在豐富了「全選複選框」複選框:dataTable的標題,而不使用JavaScript。實現「全選複選框」豐富: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事件。我看到只是其中包含INVOKE_APPLICATION選項,所以我的問題是,我如何能實現我的上述回答功能需求的getPhaseId()?或者有其他的選擇嗎?

回答

3

valueChangeListener的期間,處理驗證階段執行它的工作。但是,在提交整個表單時,提交的值將在更新模型值階段覆蓋valueChangeListener已更改的值。您確實想在「調用操作」階段執行「全選」作業。

最好是讓JSF跳過valueChangeListener方法中的所有剩餘階段,直到呈現響應,以便更改的值不會被覆蓋。您可以通過在valueChangeListener方法中調用FacesContext#renderResponse()來實現此目的。

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

我已經在一個數據表中的報頭小面複選框但用簡單的jquery,其選擇在本表中的行的所有複選框實現這一點。

如果你想避免JS,你可以在不刷新表選擇,但人生只使用全部選擇複選框本身。您可以將其映射到一個bean,並在您的應用程序中使用a4j操作(偵聽器)對其進行處理,您將在其中更新選定的id並重新放置您的表。

有更多的東西,可能可以簡化您的選擇處理程序:我已經創造了其持有的布爾並從entityquery結果的實體entityquery通用selectablewrapper。你用另一個函數包裝getresultslist返回這些包裝器的列表,你有一些非常通用的東西。在日食甚至自動完成的通用是給你正確的對象。