过滤后的数据表更新后,selectBooleanCheckbox未更新

时间:2022-10-08 07:45:13

We have a data table with 3 columns, the first has a selectBooleanCheckbox and the two last have outputText.

我们有一个包含3列的数据表,第一列有selectBooleanCheckbox,最后两列有outputText。

We also set up a filter on this table to show or hide rows depending on the filter boolean value.

我们还在此表上设置了一个过滤器,以根据过滤器布尔值显示或隐藏行。

The entity used for the data table is made with these 3 columns properties, 1 boolean, 2 String. See below.

用于数据表的实体由这3个列属性组成,1个布尔值,2个字符串。见下文。

The problem is, when we select a filter in the first column such as "Yes" and click the update button, the table will be updated but the filter is not applied thus the table filter is not refreshed.

问题是,当我们在第一列中选​​择过滤器(例如“是”)并单击更新按钮时,将更新该表,但不应用过滤器,因此不会刷新表过滤器。

Step to reproduce:

重现步骤:

  1. Load the page, don't modify any checkboxes
  2. 加载页面,不要修改任何复选框

  3. Select the filter "Yes"
  4. 选择过滤器“是”

  5. Press update button
  6. 按更新按钮

  7. The datatable is not updated
  8. 数据表未更新

This is my Entity.java

这是我的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;
    }
}

This is my simple bean

这是我的简单豆子

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;
    }
}

This is my little bean for the filter boolean value

这是我的过滤器布尔值的小豆

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]);
    }
}

And finally the xhtml file

最后是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>

1 个解决方案

#1


0  

I think dataTable should have filtered Value tag,

我认为dataTable应该有过滤的Value标签,

filteredValue="#{testBean.filteredList}"

Add a filter list in testBean and refer it.

在testBean中添加一个过滤器列表并引用它。

#1


0  

I think dataTable should have filtered Value tag,

我认为dataTable应该有过滤的Value标签,

filteredValue="#{testBean.filteredList}"

Add a filter list in testBean and refer it.

在testBean中添加一个过滤器列表并引用它。