当前位置: 首页 > 知识库问答 >
问题:

PrimeFaces数据表延迟加载两次

田马鲁
2023-03-14

问题是,每次尝试筛选表时,我的 LazyDataModel 实现中被重写的方法 load() 都会被调用两次。

我的<代码>LazyDataModel<代码>实现:

public class LazyPostDataModel extends LazyDataModel<Post> {

    private List<Post> data;
    private final PostService postService;

    public LazyPostDataModel(PostService postService) {
        this.postService = postService;
        data = new ArrayList<>();
    }

    @Override
    public Post getRowData(String rowKey) {
        Long id = Long.valueOf(rowKey);
        for (Post p : data) {
            if (p.getId().equals(id))
                return p;
        }
        return null;
    }

    @Override
    public Object getRowKey(Post post) {
        return post.getId();
    }

    @Override
    public List<Post> load(int first, int pageSize, String sortField,      SortOrder sortOrder, Map<String,Object> filters) {
        PostFilter filter = new PostFilter(filters, first, pageSize);
        FilteredDataModel<Post> postDataModel =    postService.findFilteredList(filter);
        data = postDataModel.getData();
        this.setRowCount(postDataModel.getCount().intValue());
        return data;
    }
}

我的xhtml视图:

<?xml version="1.0" encoding="UTF-8" ?>
<!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:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://xmlns.jcp.org/jsf/core">

    <ui:composition>
        <p:panel header="Posts to Review">
            <ui:include src="ModerationPostContextMenu.xhtml" />

            <p:dataTable id="ModerationPostTable" value="# {moderationPostController.posts}" var="post" lazy="true" rows="25"  widgetVar="ModerationPostTable"
                     paginator="true" rowKey="#{post.id}"  selectionMode="single" selection="#{moderationPostController.selected}"
                     paginatorTemplate="{FirstPageLink} {PreviousPageLink}  {CurrentPageReport} {NextPageLink} {LastPageLink}" >

                <p:ajax event="rowSelect"   update="@form:contextMenu" />
                <p:ajax event="rowUnselect" update="@form:contextMenu" />

                <p:column headerText="Id">
                    <h:outputText value="#{post.id}"/>
                </p:column>
                <p:column headerText="Creation Date">
                    <h:outputText value="#{post.creationDate}"/>
                </p:column>
                <p:column headerText="Author Id">
                    <h:outputText value="#{post.author.id}"/>
                </p:column>
                <p:column headerText="Author Nickname">
                    <h:outputText value="#{post.author.nickname}"/>
                </p:column>
                <p:column headerText="Text">
                    <h:outputText value="#{post.text}" />
                </p:column>
                <p:column headerText="Media" width="200">
                    <p:graphicImage value="#{mediaController.buildUrl(post.media)}" 
                                width="200" height="200"/>
                </p:column>

                <p:column headerText="Status" filterBy="#{post.moderationApproved}">
                    <f:facet name="filter">
                        <p:selectOneButton onchange="PF('ModerationPostTable').filter()">
                            <f:converter converterId="javax.faces.Boolean" />   
                            <f:selectItem itemLabel="Approved" itemValue="true" />
                            <f:selectItem itemLabel="Rejected" itemValue="false" />
                            <f:selectItem itemLabel="Review" itemValue="" />
                        </p:selectOneButton>
                    </f:facet>
                    <h:outputText value="#{post.moderationApproved}" />
                </p:column>

            </p:dataTable>
        </p:panel>
    </ui:composition>

</html>

和控制器

@Named("moderationPostController")
@SessionScoped
@Transactional(Transactional.TxType.REQUIRED)
public class ModeratioPostController extends BaseController implements Serializable {

    @Inject PostService postService;
    private LazyPostDataModel posts;

    // Selection
    private Post selected;

    @Override
    protected void initSpecific() {
        posts = new LazyPostDataModel(postService);
    }

    // Actions
    public void approve() {
        if (selected == null) return;

        Post post = postService.find(selected.getId());
        post.setModerationApproved(Boolean.TRUE);
        postService.edit(post);
    }

    public void reject() {
        if (selected == null) return;        

        Post post = postService.find(selected.getId());
        post.setModerationApproved(Boolean.FALSE);
        postService.edit(post);
    }

    public LazyPostDataModel getPosts() {
        return posts;
    }

    public void setPosts(LazyPostDataModel posts) {
        this.posts = posts;
    }

    public Post getSelected() {
        return selected;
    }

    public void setSelected(Post selected) {
        this.selected = selected;
    }

}

共有1个答案

章睿
2023-03-14

这是因为你有

filterBy="#{post.moderationApproved}"

<p:selectOneButton onchange="PF('ModerationPostTable').filter()">

这两种方法都会调用过滤器一次,并导致load方法被调用两次。只使用其中一个。

 类似资料:
  • 我有一个简单的页面: 而中的不起作用,只是刷新页面。但是外面的那个正在工作。 如果我以这种方式更改和: 内部的就像一个符咒。 有人知道为什么? 是虫子吗? 我在 玻璃鱼3.1.2 JSF 2.1.11(Mojarra) PrimeFaces 3.4-快照

  • 我想导出一个在报表生成期间具有LazyLoad数据模型的数据表(带分页)。 问题:当我导出时,报告从数据库逐页生成,然后导出到Excel/PDF,这会消耗更多时间。我想通过跳过逐页生成数据集来在单个数据库访问中获取它。 我生成了如下代码片段: JSF: 受管Bean: 数据模型: 注: < li >没有语法错误。 < li >所有自定义类型类都已定义。 如何通过跳过逐页生成记录来获得Excel报表

  • 我正在使用JSF2。0和PrimeFaces3。1和3。1用于业务逻辑。我试图使用DataTable—延迟加载。但它给了我以下的错误。请帮忙。 发生错误:

  • 我想在primeface可数据延迟加载完成后更新后备bean。我看到API有一个成功 我本可以使用监听器,但问题是监听器甚至在服务器端加载方法完成之前就被调用了。

  • 我正在使用PrimeFaces 6.0。我正在创建一个使用延迟加载的数据表。我已经设置了。但我的分页器显示不正确(它仅显示禁用的“上一步”、“下一步”、“开始”、“结束”按钮)。 当我筛选表格或更改排序时,分页器将显示页面。此外,当我运行此JavaScript时,paginator会显示页面: 关于如何让分页器在不应用黑客的情况下工作的任何想法? 这是我的表(相关属性): 我的懒人模型(相关部分)

  • 描述 (Description) 延迟加载可应用于图像,背景图像和淡入效果,如下所述 - 对于图像 要在图像上使用延迟加载,请按照给定的步骤进行操作 - 使用data-src属性而不是src属性来指定图像源。 将类lazy添加到图像。 <div class = "page-content"> ... <img data-src = "image_path.jpg" class = "l