2017-08-13 33 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