0

概要:

動的 GXT ListField を使用して、DB のある場所にあるすべての承認者を一覧表示し、選択した承認者を事前に選択します (isSelected==true)。

問題:

ストアには正しいデータがあり、リスト内の正しい序数が選択されているように見えますが、表示されている ListField のデータには、ListField が最初に読み込まれたときのデータがまだ表示されています。リスト UI を更新して、2 番目の場所からアイテムを表示することができません。

例:

ロケーション 1:

すべての承認者={a,b,c,d,e,f,g,h,i,j}

選択した承認者 = {a,b,c}

display={ [a],[b],[c] ,d,e,f,g,h,i,j} ここで[] = 選択済み

ロケーション 2:

すべての承認者={x,y,z,l,m,n,o,p,q,r}

選択した承認者 = {x,y,z,l}

display={ [a],[b],[c],[d] ,e,f,g,h,i,j} [] = 選択済み(エラー!)

= { [x]、[y]、[z]、[l]、m、n、o、p、q、r}

注: 4が選択されました。これは、正しいストアを使用していることを意味しますが、表示にはまだ location1 データが表示されます :(

コード:

ListField<Approver>() approversListField ;

    OnModuleload() //..not including for simplicity
    {
    :

    panel.add(getInitialApproverList());
    loadApprovers(1);
    loadApprovers(2);
    }

        private Widget getInitialApproverList() {

            approversListField = new ListField<Approver>();
            approversListField.setEmptyText("employee last name");
            approversListField.setTemplate(getApproverTemplate());
            approversListField.setFieldLabel("Approvers *");
            approversListField.setId("approvers");
            approversListField.setEmptyText("No approvers available.");

                return approversListField;

        }

        private void loadApprovers(int locationID) {

                ListStore<Approver> approversStore = dataStores.getApprovers(locationID);           
                approversListField.setStore(approversStore);
                approversListField.setValueField("userID");
                approversStore.addStoreListener(new StoreListener<Approver>() {
                    @Override
                    public void storeDataChanged(StoreEvent<Approver> se) {
                        super.storeDataChanged(se);

                        approversListField.fireEvent(Events.Render);

                    }
                });

                /**
                 * // * Attach render listener, had to do it on render because select()
                 * // * method only works onrender // *
                 * http://www.sencha.com/forum/showthread.php?55659-Selecting-Items-in-ListField-After-Load // *
                 */
                approversListField.addListener(Events.Render, new Listener<BaseEvent>() {
                    @Override
                    public void handleEvent(BaseEvent be) {

                        ListViewSelectionModel<Approver> approverListFieldSelectionModel = approversListField.getListView()
                                .getSelectionModel();


                        approversListField.getListView().refresh();
                        approverListFieldSelectionModel.deselectAll();                                      

                        System.out.println("approversStore size:"+approversListField.getStore().getCount());
                        for (int i = 0; i < approversListField.getStore().getCount(); i++) {
                            Approver app = approversListField.getStore().getAt(i);

                            System.out.println(app);                    
                            if (app.isSelected() == true) {

                                System.out.println("FOUND THE APPROVER!  " + i);
                                approverListFieldSelectionModel.select(app, true);                                                                              

                            }
                        }

                    }
                });

        }
4

1 に答える 1

0

最後に自分で見つけました。それが価値があるもののためにここに残します。

ストアが変更された場合、 Listfield の View のストアもリセットする必要があるようです。

approversListField.getListView().setStore(approversListField.getStore());

Renderを起動する必要はありません。変更されたストアデータですべて実行できます。

approversStore.addStoreListener(new StoreListener<Approver>() {
            @Override
            public void storeDataChanged(StoreEvent<Approver> se) {
                super.storeDataChanged(se);

                ListViewSelectionModel<Approver> approverListFieldSelectionModel = approversListField.getListView()
                        .getSelectionModel();
                approverListFieldSelectionModel.deselectAll();
                approversListField.getListView().setStore(approversListField.getStore());
                approversListField.getListView().refresh();
                for (int i = 0; i < approversListField.getStore().getCount(); i++) {                    
                    Approver app = approversListField.getStore().getAt(i);
                    if (app.getIsselected() == true) {                  
                        approverListFieldSelectionModel.select(i, true);

                    }
                }

            }
        });
于 2013-08-14T18:12:54.627 に答える