PrimeFaces DataTable延迟加载加载两次

时间:2015-07-01 12:50:32

标签: jsf jsf-2 primefaces datatable lazy-loading

问题在于,每当我尝试过滤表时,load()实现中的重写方法LazyDataModel被称为两次

我的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 个答案:

答案 0 :(得分:-1)

这是因为你有

filterBy="#{post.moderationApproved}"

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

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