2013-10-21 39 views
4

我正在使用LazyDataModel使用primefaces 4.0數據表。我也在使用<p:rowEditor />,當一行被編輯和保存時,我的數據表數據沒有被更新。看來LazyDataModel.load方法不會在ajax更新上調用。使用LazyDataModel不更新的Primefaces數據表。似乎加載方法沒有被調用

有什麼我做錯了或解決方法?這是一個已知的問題嗎?

LazyUserDataModel.java

public class LazyUserDataModel extends LazyDataModel<User> { 

     private static final long serialVersionUID = -7759670987463023731L; 
     private List<User> users; 
     private Dao dao; 
     private String username; 
     private List<String> roles; 

     public LazyUserDataModel(Dao dao, String username, List<String> roles) { 
      this.dao = dao; 
      this.username = username; 
      this.roles = roles; 
     } 

     @Override 
     public List<User> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,String> filters) { 

      List<User> users = new ArrayList<User>(); 
      users = dao.findAllUsers(username, roles, first, pageSize); 
    ... 

UserGroupBacking.java

... 
    private LazyDataModel<User> users; 

    @PostConstruct 
     public void init() { 
      this.ds = databaseBacking.getDs(); 
      if(isLoggedIn()) { 
       loadData(); 
      } 
     } 

    public void updateUsersGroups(RowEditEvent event) { 
     // Save data to db (this part works fine) 
     loadData(); 
    } 

    private void loadData() { 
      Dao dao = new Dao(ds); 
      users = new LazyUserDataModel(dao, accessBacking.getUsername(), accessBacking.getRoles()); 
     } 
    ... 

.xhtml

<p:tabView id="tabs"> 

    <p:tab id="userTab" title="Users"> 
     <h:form id="userForm"> 

      <p:growl for="growl" severity="info" autoUpdate="true" showDetail="true" /> 
      <p:messages id="userMessages" severity="error" showDetail="true" /> 

      <p:dataTable var="user" value="#{userGroupBacking.users}" editable="true" id="userTable" paginator="true" rows="20" 
        paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}" lazy="true" 
        filteredValue="#{userGroupBacking.filteredUsers}" > 

       <p:ajax event="rowEdit" listener="#{userGroupBacking.updateUsersGroups}" update=":tabs:userForm:userTable, :tabs:userForm:userMessages" /> 

       <p:column headerText="User" filterBy="#{user.name}" filterMatchMode="contains"> 
        <h:outputText value="#{user.name}" /> 
       </p:column> 

       <p:column headerText="Groups"> 
        <p:cellEditor> 
         <f:facet name="output"> 
          <ui:repeat var="group" value="#{user.groups}"> 
           <h:outputText value="#{group.name}" /><br /> 
          </ui:repeat> 
         </f:facet> 
         <f:facet name="input"> 
          <p:selectCheckboxMenu value="#{user.groupsAsString}" label="Groups" filter="true" filterText="Filter" filterMatchMode="contains"> 
           <f:selectItems value="#{userGroupBacking.groupsAsSelectItems}" /> 
          </p:selectCheckboxMenu> 
         </f:facet> 
        </p:cellEditor> 
       </p:column> 
... 

回答

4

看來,<p:ajax event="rowEdit">做設計表裏面沒有更新以外的任何其他編輯的行。即使沒有明確指定update屬性。它會被忽略。這可能是有道理的,但這是IMO過於熱情,值得一個問題報告。

我做了一些挖掘源代碼,但它似乎並不容易,很可能改變/重寫此行爲。最好的辦法是在單獨的ajax請求中執行整個表的更新。 <p:remoteCommand>在這方面很有幫助。

而不是

<p:dataTable id="userTable" ...> 
    <p:ajax event="rowEdit" listener="#{userGroupBacking.updateUsersGroups}" update=":tabs:userForm:userTable, :tabs:userForm:userMessages" /> 
    ... 
</p:dataTable> 

<p:remoteCommand name="updateUsersGroups" action="#{userGroupBacking.updateUsersGroups}" update="userTable userMessages" /> 
<p:dataTable id="userTable" ...> 
    <p:ajax event="rowEdit" oncomplete="updateUsersGroups()" /> 
    ... 
</p:dataTable> 

並從方法RowEditEvent說法。


順便說一句,而不是爲了迫使懶惰的數據模型的重裝再造整個LazyDataModel,你可以備選地也只得到DataTable組件實例以某種方式處理(如方法參數?)並在其上調用loadLazyData()方法。例如。通過binding

<p:remoteCommand name="updateUsersGroups" action="#{userGroupBacking.updateUsersGroups(userTable)}" update="userTable userMessages" /> 
<p:dataTable id="userTable" binding="#{userTable}" ...> 
    <p:ajax event="rowEdit" oncomplete="updateUsersGroups()" /> 
    ... 
</p:dataTable> 

public void updateUsersGroups(DataTable table) { 
    // ... 
    table.loadLazyData(); 
} 
相關問題