4

LazyDataModel を使用して、primefaces 4.0 データテーブルを使用しています。私も使用して<p:rowEditor />おり、行を編集して保存すると、データテーブルのデータが更新されません。ajax 更新時に LazyDataModel.load メソッドが呼び出されないようです。

私が間違っていることや回避策はありますか?これは既知の問題ですか?

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

1 に答える 1

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();
}
于 2013-11-03T16:50:31.293 に答える