简体   繁体   English

Primefaces:Ajax导航和dataTable复选框选择

[英]Primefaces: ajax navigation and dataTable checkbox selection

I am experiencing checkbox selection problem in my application. 我在我的应用程序中遇到复选框选择问题。 I have a dataTable on one page(index.xhtml). 我在一页上有一个dataTable(index.xhtml)。 On same page there is a ajax button and when user click on it application should navigate to another page(detail.xhtml). 在同一页面上有一个ajax按钮,当用户单击它时,应用程序应导航到另一页面(detail.xhtml)。 Detail page contains return button for navigating back to index.xhtml. 详细信息页面包含用于导航回到index.xhtml的返回按钮。 Navigation works but when user return from detail page, row checkboxes in dataTable are not checked when user click on it(header checkbox selecting all rows works). 导航有效,但是当用户从详细信息页面返回时,当用户单击它时,不会选中dataTable中的行复选框(选择所有行的标题复选框有效)。 When i repeat scenario(aka visiting detail page and return back), checkboxes are working again. 当我重复场景(又名访问详细信息页面并返回)时,复选框再次起作用。 After third repeat, they are not working again(so every second navigation they do not work). 在第三次重复之后,它们不再起作用(因此,每隔两次导航它们都将不起作用)。 When I use ajax="false" or faces-redirect=true on buttons, everything works. 当我在按钮上使用ajax =“ false”或faces-redirect = true时,一切正常。

Using Mojarra 2.10.19, PF 3.5 and Glassfish 3.2.1 使用Mojarra 2.10.19,PF 3.5和Glassfish 3.2.1

For simplicity i re-create the problem by simple example: 为简单起见,我通过简单的示例重新创建问题:

index.xhtml: index.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"      
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:p="http://primefaces.org/ui" >

<h:head></h:head>   
<h:body>
    <h:form>
        <p:commandButton value="Add" action="add" />
        <p:dataTable id="cars" var="car" value="#{tableBean.mediumCarsModel}" 
                     selection="#{tableBean.selectedItems}" >

            <p:column selectionMode="multiple" style="width: 2%" />

            <p:column headerText="Model">
                #{car.model}
            </p:column>

        </p:dataTable> 
    </h:form>    
</h:body>

detail.xhtml: detail.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:p="http://primefaces.org/ui" >

<h:head></h:head>

<h:body>
     <h:form>
      <p:commandButton value="Return" action="return" /> 
     </h:form>    
</h:body>

TableBean.java TableBean.java

@ManagedBean
@SessionScoped
public class TableBean {    
    private final static String[] manufacturers;

    static { 
      manufacturers = new String[10];
      manufacturers[0] = "Mercedes";
      manufacturers[1] = "BMW";
      manufacturers[2] = "Volvo";
      manufacturers[3] = "Audi";
      manufacturers[4] = "Renault";
      manufacturers[5] = "Opel";
      manufacturers[6] = "Volkswagen";
      manufacturers[7] = "Chrysler";
      manufacturers[8] = "Ferrari";
      manufacturers[9] = "Ford";
    }

    private List<Car> carsSmall;    
    private CarDataModel mediumCarsModel;
    private List<Car> selectedItems; 

    public TableBean() {
        carsSmall = new ArrayList<Car>();
        populateRandomCars(carsSmall, 5);
        mediumCarsModel = new CarDataModel(carsSmall);
    }

    private void populateRandomCars(List<Car> list, int size) {
        for (int i = 0; i < size; i++) {
            list.add(new Car(manufacturers[i]));
        }
    }

    public List<Car> getSelectedItems() {
        return selectedItems;
    }

    public void setSelectedItems(List<Car> selectedItems) {        
        this.selectedItems = selectedItems;
    }

    public CarDataModel getMediumCarsModel() {        
        return mediumCarsModel;
    }
}

CarDataModel.java CarDataModel.java

public class CarDataModel extends ListDataModel<Car> implements SelectableDataModel<Car> {  

    public CarDataModel(List<Car> data) {
        super(data);
    }

    @Override
    public Car getRowData(String rowKey) { 
        List<Car> cars = (List<Car>) getWrappedData();

        for(Car car : cars) {
            if(car.getModel().equals(rowKey)){                
                return car;
            }
        }
        return null;
    }

    @Override
    public Object getRowKey(Car car) {
        return car.getModel();
    }
}

Car.java 汽车.java

public class Car implements Serializable {

    private String model;

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public Car(String model) {
        this.model = model;
    }
}

faces-config.xml faces-config.xml

<navigation-rule>
    <from-view-id>/index.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>add</from-outcome>
        <to-view-id>/detail.xhtml</to-view-id>
    </navigation-case>       
</navigation-rule>   

<navigation-rule>
    <from-view-id>/detail.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>return</from-outcome>
        <to-view-id>/index.xhtml</to-view-id>
    </navigation-case>       
</navigation-rule> 

You many need to remove navigation-rule from faces-config.xml to try the following... 您可能需要从faces-config.xml中删除导航规则 ,才能尝试以下操作...

index.xhtml index.xhtml

<p:commandButton value="Add" action="#{tableBean.redirectToDetail}" />

detail.xhtml detail.xhtml

<p:commandButton value="Return" action="#{tableBean.redirectToIndex}" />

TableBean.java TableBean.java

@ManagedBean(name = "tableBean")
...
...
...
public String redirectToDetail() {
    return "detail?faces-redirect=true";
}
public String redirectToIndex() {
    return "index?faces-redirect=true";
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM