Jsf PrimeFaces数据表延迟加载被加载两次
问题是每次我尝试筛选表时,我的Jsf PrimeFaces数据表延迟加载被加载两次,jsf,jsf-2,primefaces,datatable,lazy-loading,Jsf,Jsf 2,Primefaces,Datatable,Lazy Loading,问题是每次我尝试筛选表时,我的LazyDataModel实现中重写的方法load()都会被调用两次 我的LazyDataModel实现: public class LazyPostDataModel extends LazyDataModel<Post> { private List<Post> data; private final PostService postService; public LazyPostDataModel(PostS
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;
}
}
这是因为你有
filterBy="#{post.moderationApproved}"
及
这两种方法都将调用过滤器一次,并导致load方法被调用两次。
仅使用其中一个。检查是否多次调用了来自
BaseController
(initSpecific()
)的重写方法本身。如果多次呼叫,可能存在不同的问题。谢谢您的帮助。不,initSpecific()
它只是在@postcontuct super.init()
中调用的一个特定init,因此表中没有太多模型。PrimeFaces:5.2,JSF:2.2
@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;
}
}
filterBy="#{post.moderationApproved}"
<p:selectOneButton onchange="PF('ModerationPostTable').filter()">