JSF-2 Select/Unselect 所有带有单个复选框的复选框列表
JSF-2 Select/Unselect all the list of checkboxes with single checkbox
我在 rich:dataTable 中有一个复选框列表,我想用 header 列中的一个复选框一次选中所有复选框。
<rich:column id="includeInWHMapping" >
<f:facet name="header">
<h:selectBooleanCheckbox value="#{checkallbox.selectAll}">
<f:ajax actionListener="#{checkallbox.selectAllBox}" render="selectedForWHProcess" />
</h:selectBooleanCheckbox>
</f:facet>
<h:selectBooleanCheckbox id="selectedForWHProcess" value="#{checkallbox.checked[data]}">
<f:ajax actionListener="#{checkallbox.selectAllRows}"/>
</h:selectBooleanCheckbox></rich:column>
checkallbox Bean 中的代码:
private Map<StandardStructure, Boolean> checked = new HashMap<StandardStructure, Boolean>();
private boolean selectAll;
public boolean isSelectAll() {
return selectAll;
}
public void setSelectAll(boolean selectAll) {
this.selectAll = selectAll;
}
public Map<StandardStructure, Boolean> getChecked() {
return checked;
}
public void setChecked(Map<StandardStructure, Boolean> checked) {
this.checked = checked;
}
public void selectAllBox(ValueChangeEvent e){
boolean newSelectAll = (Boolean) e.getNewValue();
Iterator<StandardStructure> keys = checked.keySet().iterator();
while(keys.hasNext()){
StandardStructure ss = keys.next();
checked.put(ss, newSelectAll);
}
}
当我检查 header 列的 h:selectBooleanCheckBox 时,没有任何反应。我在这里错过了什么?我是否也必须为 "selectAll" 属性 实施 Map?
谢谢。
首先。 f:ajax
没有 actionListener
,它有一个 listener
。阅读文档 here. Second thing, you can use valueChangeListener
on h:selectBooleanCheckbox
and only there. Third, listener inside rows boxes is wrong. Basically, it looks like you need to read this topic.
现在,这是工作示例:
<h:form>
<rich:dataTable value="#{checkallbox.allValues}" var="data" id="dataTable">
<rich:column>
<f:facet name="header">
<h:selectBooleanCheckbox value="#{checkallbox.selectAll}"
valueChangeListener="#{checkallbox.selectAllBox}">
<f:ajax render="dataTable" />
</h:selectBooleanCheckbox>
</f:facet>
<h:selectBooleanCheckbox value="#{checkallbox.checked[data]}">
<f:ajax />
</h:selectBooleanCheckbox>
</rich:column>
<!-- other columns -->
</rich:dataTable>
</h:form>
您的代码可能存在的其他问题(因为您只分享了一部分)。
- 数据 table 需要格式,因为你在里面执行 ajax。
- 你在地图中的键是对象。您必须确保
equals
方法是好的。在 95% 的情况下,默认值不是,特别是如果它们是 @Entity
.
您必须确保地图一开始填充的是false。我使用 @PostConstruct
:
@PostConstruct
protected void performPostConstructAction() {
for (StandardStructure s : getAllValues()) {
checked.put(s, false);
}
}
谢谢埃米尔!我解决了。
public void selectAllBox(){
if(!selectAll){
for(StandardStructure item : ssTable.getDto()){
checked.put(item, true);
}
}else{
for(StandardStructure item : ssTable.getDto()){
checked.put(item, false);
}
}
}
我在 rich:dataTable 中有一个复选框列表,我想用 header 列中的一个复选框一次选中所有复选框。
<rich:column id="includeInWHMapping" >
<f:facet name="header">
<h:selectBooleanCheckbox value="#{checkallbox.selectAll}">
<f:ajax actionListener="#{checkallbox.selectAllBox}" render="selectedForWHProcess" />
</h:selectBooleanCheckbox>
</f:facet>
<h:selectBooleanCheckbox id="selectedForWHProcess" value="#{checkallbox.checked[data]}">
<f:ajax actionListener="#{checkallbox.selectAllRows}"/>
</h:selectBooleanCheckbox></rich:column>
checkallbox Bean 中的代码:
private Map<StandardStructure, Boolean> checked = new HashMap<StandardStructure, Boolean>();
private boolean selectAll;
public boolean isSelectAll() {
return selectAll;
}
public void setSelectAll(boolean selectAll) {
this.selectAll = selectAll;
}
public Map<StandardStructure, Boolean> getChecked() {
return checked;
}
public void setChecked(Map<StandardStructure, Boolean> checked) {
this.checked = checked;
}
public void selectAllBox(ValueChangeEvent e){
boolean newSelectAll = (Boolean) e.getNewValue();
Iterator<StandardStructure> keys = checked.keySet().iterator();
while(keys.hasNext()){
StandardStructure ss = keys.next();
checked.put(ss, newSelectAll);
}
}
当我检查 header 列的 h:selectBooleanCheckBox 时,没有任何反应。我在这里错过了什么?我是否也必须为 "selectAll" 属性 实施 Map?
谢谢。
首先。 f:ajax
没有 actionListener
,它有一个 listener
。阅读文档 here. Second thing, you can use valueChangeListener
on h:selectBooleanCheckbox
and only there. Third, listener inside rows boxes is wrong. Basically, it looks like you need to read this topic.
现在,这是工作示例:
<h:form>
<rich:dataTable value="#{checkallbox.allValues}" var="data" id="dataTable">
<rich:column>
<f:facet name="header">
<h:selectBooleanCheckbox value="#{checkallbox.selectAll}"
valueChangeListener="#{checkallbox.selectAllBox}">
<f:ajax render="dataTable" />
</h:selectBooleanCheckbox>
</f:facet>
<h:selectBooleanCheckbox value="#{checkallbox.checked[data]}">
<f:ajax />
</h:selectBooleanCheckbox>
</rich:column>
<!-- other columns -->
</rich:dataTable>
</h:form>
您的代码可能存在的其他问题(因为您只分享了一部分)。
- 数据 table 需要格式,因为你在里面执行 ajax。
- 你在地图中的键是对象。您必须确保
equals
方法是好的。在 95% 的情况下,默认值不是,特别是如果它们是@Entity
. 您必须确保地图一开始填充的是false。我使用
@PostConstruct
:@PostConstruct protected void performPostConstructAction() { for (StandardStructure s : getAllValues()) { checked.put(s, false); } }
谢谢埃米尔!我解决了。
public void selectAllBox(){
if(!selectAll){
for(StandardStructure item : ssTable.getDto()){
checked.put(item, true);
}
}else{
for(StandardStructure item : ssTable.getDto()){
checked.put(item, false);
}
}
}