我们有一个包含3列的数据表,第一列有selectBooleanCheckbox,最后两列有outputText。
我们还在此表上设置了一个过滤器,以根据过滤器布尔值显示或隐藏行。
用于数据表的实体由这3个列属性组成,1个布尔值,2个字符串。见下文。
问题是,当我们在第一列中选择过滤器(例如“是”)并单击更新按钮时,表格将会更新,但不会应用过滤器,因此不会刷新表格过滤器。
重现步骤:
这是我的Entity.java
public class Entity {
boolean enabled;
private String label;
private String description;
public Entity(boolean enabled, String label, String description) {
this.enabled = enabled;
this.label = label;
this.description = description;
}
public boolean getEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
这是我的简单豆
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
@Controller
@Scope ("view")
public class TestBean {
private List<Entity> list;
public TestBean() {
list = new ArrayList<Entity>();
/* Populate examples */
list.add(new Entity(true, "Book", "This is a C book"));
list.add(new Entity(false, "Screen", "21\" HP Screen"));
list.add(new Entity(true, "Game", "You won 1 million"));
}
/*
* Update list, in the real application it is a little bit more complicated
* but I simplified it and the problem is reproducible for this stuff too.
*/
public void update() {
Entity entity;
/* "Disable" the third because we didn't win */
entity = list.get(2);
entity.setEnabled(false);
}
public List<Entity> getList() {
return list;
}
public void setList(List<Entity> list) {
this.list = list;
}
}
这是我的小豆,用于过滤器布尔值
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
/**
* The Class BooleanListBean.
*/
@Controller
@Scope ("session")
@SuppressWarnings ("serial")
public class BooleanListBean implements Serializable {
/**
* Instantiates a new boolean list bean.
*/
public BooleanListBean() {
super();
}
/**
* Gets the options.
*
* @return the options
*/
public SelectItem[] getOptions() {
final List<SelectItem> options = new ArrayList<SelectItem>();
final FacesContext facesContext = FacesContext.getCurrentInstance();
options.add(new SelectItem("", "Select"));
options.add(new SelectItem(Boolean.FALSE.toString(), "No"));
options.add(new SelectItem(Boolean.TRUE.toString(), "Yes"));
return options.toArray(new SelectItem[0]);
}
}
最后是xhtml文件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
xmlns:p="http://primefaces.org/ui"
xmlns:ft="http://primefaces.prime.com.tr/facestrace"
xmlns:t="http://myfaces.apache.org/tomahawk"
xmlns:util="http://java.sun.com/jsf/composite/components/util">
<ui:composition template="/xhtml/common/toolbarLayout.xhtml">
<ui:define name="content">
<p:commandButton value="Update"
actionListener="#{testBean.update}"
update=":contentForm:entityList" />
<p:dataTable value="#{testBean.list}" var="entity" id="entityList" widgetVar="entityList">
<p:column headerText="Activated"
filterBy="#{entity.enabled}" filterOptions="#{booleanListBean.options}">
<h:selectBooleanCheckbox value="#{entity.enabled}" />
</p:column>
<p:column headerText="Label">
<h:outputText value="#{entity.label}" />
</p:column>
<p:column headerText="Description">
<h:outputText value="#{entity.description}" />
</p:column>
</p:dataTable>
</ui:define>
</ui:composition>
</html>
答案 0 :(得分:0)
我认为dataTable应该已经过滤了Value标签,
filteredValue="#{testBean.filteredList}"
在testBean中添加一个过滤器列表并引用它。