Primefaces数据表格问题

4
什么是使用LazyDataModel方法刷新后续页面(第二页、第三页等)的Primefaces dataTable数据的方法?
另外,如果我在dataTable中选择一个项目以查看其详细信息并跳转到另一页,然后通过浏览器的“后退”按钮或实现JavaScript的history.back()方法返回到dataTable页面时,似乎dataTable总是将其位置重置为第一页,而不是返回到用户所在的页面。如何强制dataTable保留在最后查看的页面?
我的懒加载代码如下:
private final class LazyLoader extends LazyDataModel<BookModel>
{
    private static final long serialVersionUID = 1L;

    public LazyLoader(String sort, String category, String operator, String input) {
        setListing(getBookService().getListing(sort, category, operator, input));
    }

    @Override
    public List<BookModel> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) {
        return getListing();
    }
}

Submit方法的定义如下:

public String Submit()
{
    sort     = sortBean.getSort();
    category = categoryBean.getCategory();
    operator = operatorBean.getOperator(); 
    input    = searchBean.getInput();

    lazyModel = new LazyLoader(sort, category, operator, input);
    lazyModel.setRowCount(listing.size());

    return null;
} 

我正在使用@ViewScoped来列出书籍记录以及显示书籍记录的详细信息。

有人在使用Primefaces dataTable时遇到类似的问题吗?

3个回答

1

继续使用@ViewScoped。除非您真正需要,否则不应使用@SessionScoped

要记住上一页,您必须设置load方法的first属性。您可以使用请求参数来完成这个操作。例如:yourview.xhtml?f=3

关于刷新,问题在于您正在使用惰性加载器,但是您一次性加载了所有内容...您的load方法应该按页进行查询,即按需查询。


感谢您的反馈。是的,在我的情况下,@ViewScoped 已经足够了。好的,我会尝试请求参数方法并审查我的 LazyLoader 方法。 - ChuongPham
2
经过多次尝试和错误,我决定使用标准的Mojarra dataTable组件来实现自己的数据表格和导航。Primefaces dataTable似乎无法正常工作。由于我在Web项目中提供了拉丁文和非拉丁文UTF-8支持(数据输入、搜索、排序和过滤),最好编写自己的方法来控制dataTable组件。当4.x.x版本推出时,可以再次查看Primefaces dataTable - 到那时可能会有所不同!... :) - ChuongPham
使用@ViewScoped解决了我的问题。然而,我后来转向了OmniFaces,因为它的支持和Java库比PrimeFaces更好。 - user4750643

0
为了保留所选页面,您需要完成两件事。
首先,将managedBean设置为session scoped。
其次,在datatable和UIData对象之间设置绑定。例如,在您的后端bean中放置以下内容:
private UIData filasUIData = null;

public UIData getFilasUIData() {
    return filasUIData;
}

public void setFilasUIData(UIData filasUIData) {
    this.filasUIData = filasUIData;
}

现在在你的数据表中

<ice:dataTable
    binding="#{yourBean.filasUIData}"

就这些。


0

在没有懒加载的情况下,分页是否对您有效?在进入最困难的情况之前,请先验证其是否按预期工作。

如果您希望dataTable在您从JSF页面导航离开后记住上次的分页,则需要将托管bean设置为SessionScoped。ViewScoped托管bean的生命周期在导航离开视图后结束。


1
此外,我想补充一点,如果要刷新懒加载的dataTable上的数据,则可以尝试实例化并分配一个新的LazyLoadDataModel。 - maple_shaft
@maple_shaft:我尝试了@SessionScoped,但没有任何改变——当我点击浏览器的“返回”按钮或执行JavaScript的history.back()方法时,dataTable会跳转到第一页。我不理解你的第二条评论。 - ChuongPham
1
@maple_shaft:是的,它可以在没有延迟加载的情况下工作,但我仍然有dataTable跳回第一页的问题。 - ChuongPham
我建议你尝试创建一个新的LazyDataModel对象,并替换你在托管bean中引用的那个对象。如果这样做不能刷新表格中的数据,那么可能是你的getBookServer和getListing代码出了问题。 - maple_shaft
@maple_shaft: 你是说在 LazyLoader 方法中完成吗?怎么实现呢? - ChuongPham
7
@maple_shaft:这不是英语的问题——而是因为我不知道怎么做——所以我在Stackoverflow上问这个问题。如果我知道怎么做,我就不会问了,对吧? :) - ChuongPham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接