在某些情况下,数据表中的CommandLink不起作用

时间:2014-03-24 08:23:33

标签: jsf primefaces

我有CommandLink / CommandButton,它是dataTable中列的元素。 dataTable与惰性模型集成在一起。我的代码(不完全是我的,因为这是主要的展示示例)在表格中的记录数可以被页面大小整除时非常有效。例如,页面大小为5,记录数为60.但是,当记录数为61时,当我到达表中的最后一条记录时,不会调用每个按钮的动作侦听器。我试图将p:commandlink更改为h:commandbutton / p:commandbuton。我已经尝试了所有与使用update =" @ form"相关的stackoverflow提示。或立即="真"或者通过ajax =" false"禁用ajax请求,但结果是相同的。对我来说,它看起来像dataTable渲染的问题。请查看源代码。这个例子基于primefaces展示,我只添加了一个新列(这个与commandlink一起)。

xhtml页面:

<h:form id="form">
<p:dataTable styleClass="test-class" id="data" var="car" value="#{tableBean.lazyModel}" scrollable="true" liveScroll="true" scrollRows="5" scrollHeight="200" lazy="true" >
        <p:column headerText="Model">
            <h:outputText value="#{car.model}" />
        </p:column>

        <p:column headerText="Year">
            <h:outputText value="#{car.year}" />
        </p:column>

        <p:column headerText="Manufacturer">
            <h:outputText value="#{car.manufacturer}" />
        </p:column>

        <p:column headerText="Color">
            <h:outputText value="#{car.color}" />
        </p:column>

        <p:column headerText="Color">
            <p:commandLink value="Test"
                actionListener="#{tableBean.buttonListener()}" />
        </p:column>

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

数据表懒惰模型:

public class MyLazyModel extends LazyDataModel<Car> {


private List<Car> datasource;

public MyLazyModel(List<Car> datasource) {
    this.datasource = datasource;
}

@Override
public Car getRowData(String rowKey) {
    for(Car car : datasource) {
        if(car.getModel().equals(rowKey))
            return car;
    }

    return null;
}

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

@Override
public List<Car> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,String> filters) {
    //rowCount
    int dataSize = datasource.size();
    this.setRowCount(dataSize);


    //paginate
    if(dataSize > pageSize) {
        try {
            return datasource.subList(first, first + pageSize);
        }
        catch(IndexOutOfBoundsException e) {
            return datasource.subList(first, first + (dataSize % pageSize));
        }
    }
    else {
        return datasource;
    }


}
}

DataTable bean:

@ManagedBean
@ViewScoped
public class TableBean {  

private LazyDataModel<Car> lazyModel;  

private Car selectedCar;  

private List<Car> cars;  


public TableBean() {  
    populateRandomCars(cars, 60);  
    lazyModel = new MyLazyModel(cars);  
}  


public void setSelectedCar(Car selectedCar) {  
    this.selectedCar = selectedCar;  
}  

public LazyDataModel<Car> getLazyModel() {  
    return lazyModel;  
}  

0 个答案:

没有答案