2017-08-13 34 views
0

我建立一个单一的网页应用程序的HTML与Primefaces 6.1JSF 2.2并运行它Wildfly,其中有一个选项来搜索用户。初始视图只显示带有各种过滤器的搜索面板,点击搜索时,将查询用户表并返回一组数据,然后在包含datatable的视图中呈现块。以下是搜索用户的延迟加载代码。Primefaces惰性加载渲染行作为分页

public void getUsers(ActionEvent event) { 
    //few lines to get filterData 
    this.lazyUsers = new LazyDataModel<UserModel>() { 
     private static final long serialVersionUID = 1L; 
     @Override 
     public List<UserModel> load(int first, int pageSize, String sortField, SortOrder sortOrder, 
         Map<String, Object> filters) { 

      filterObject.setStartCount(new Long(first)); 
      filterObject.setCountPerPage(new Long(pageSize)); 
      List<UserModel> list = userService.getUsers(filterObject); 
      if (list != null) 
       this.setRowCount(list.get(0).getTotalNumberOfRecords().intValue()); 
      RequestContext context = RequestContext.getCurrentInstance(); 
      if(context!=null) 
       context.addCallbackParam("totalRecords", this.getRowCount()); 
      return list; 
     } 
    }; 
} 

这里是我的表格视图。

<p:outputPanel id="users" autoUpdate="true"> 
    <p:outputPanel rendered="#{users.displayusers}"> 
     <h5 class="title"> 
      <h:outputText value="#{msg.header_title}"></h:outputText> 
     </h5> 
     <p:dataTable id="userTable" lazy="true" paginator="true" 
      rows="2" 
      emptyMessage="#{msg.emtpymsg}" 
      paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
      rowsPerPageTemplate="2,4,5" 
      rendered="#{null != users.lazyUsers &amp;&amp; not empty users.lazyUsers }" 
      value="#{users.lazyUsers}" var="user" 
      rowIndexVar="userRow"> 
      <p:column headerText="#{msg.Name}"> 
       <h:outputLabel class="tdRow" value="#{user.name}" /> 
      </p:column> 
      <p:column headerText="#{msg.Phone}"> 
       <h:outputLabel class="tdRow" value="#{user.phone}" /> 
      </p:commandLink> 
      </p:column> 
      <p:column headerText="#{msg.Address}"> 
       <h:outputLabel class="tdRow" value="#{user.address}" /> 
      </p:column> 
      <p:column headerText="#{msg.Email}"> 
       <h:outputLabel class="tdRow" value="#{user.email}" /> 
      </p:column> 
     </p:dataTable> 
    </p:outputPanel> 
</p:outputPanel> 

一切呈现在搜索发生,但后来当我拼版它会寻找下一个页面的数据,并获取下一个页面的数据,但它呈现为普通的HTML取出数据表。在检查html时,我只能看到trtd作为来自网络选项卡中的服务器的响应,并且只有其中的内容被直接呈现为div。数据表未预先保存。任何人都可以让我知道这里发生了什么。

我也试图捕捉事件中datatable并添加update价值

<p:ajax event="page" update="userContainer:userTable"></p:ajax> 

但同样没有帮助。希望能找到一些帮助。

更新

我注意到,这种情况对任何AJAX操作通过datatables一样,筛选,排序,rowsperpage变化等,有没有什么办法,以确定在什么不对的?

+0

[Primefaces Datatable display bug]可能的副本(https://stackoverflow.com/questions/44270955/primefaces-datatable-display-bug) – Kukeltje

+0

@Kukeltje尽管问题有点类似于他的解决方案是使用在''ajax'分页'process'而不是'update'。我更新了我的问题,并为此添加了一个答案。谢谢.. :) –

回答

0

更改rendered属性的值。尝试封装另一个组件中的dataTable,并重新渲染此外部组件。

如果你把一个虚拟表模板也可以是有帮助的,是始终呈现,EG:

<p:dataTable disabled="true" /> 

这将确保所有dataTable需要的库在你的页面的第一负荷加载。 ..

+0

''我试过了,但没有多大帮助。 ajax之后的结果是一样的。你能否在第一点上添加一些细节?这将有所帮助。 –

0

这个问题的解决方案非常简单。

我必须保持<p:ajax event="page" update="userContainer:userTable"></p:ajax>而非更新,我不得不使用过程,并与ignoreAutoUpdate="true"

<p:ajax event="page" ignoreAutoUpdate="true" process="userContainer:userTable"></p:ajax> 

这固定的问题。希望这对将来的某个人有用。

+0

尝试没有进程属性。应该工作相同...然后Q是重复的 – Kukeltje

+0

@Kukeltje那么也有'ignoreAutoUpdate'属性基本上做这个工作,而且,在这里我的outercomponent永远不会被取代。那么,即使问题是相同的,因为方法,解决方案是不同的。 –

+0

是的,**该部分是正确的,我从来没有说过。然而,过程部分是不相关的。那么有效的原因和功能解决方案是相同的...防止两个更新发生。我更新了其他Q/A,并声明可以添加'ignoreAutoUpdate =“true”' – Kukeltje