3

RequestFactory を使用して GWT の CellTable の例を知っている人はいますか?そのテーブルは編集されていますか? テーブルにオブジェクトをリストし (各行が 1 つのオブジェクトで、各列が 1 つのプロパティ)、新しいオブジェクトを簡単に追加して編集できるようにしたいと考えています。Google の DynaTableRf の例は知っていますが、それは編集されていません。

Google と stackoverflow を検索しましたが、見つかりませんでした。私は RF のコンテキストに少し混乱してしまい、人々は「ドライバー」についても言及しました。

現在到達した場所を示すために、1 つの列のコードを添付します。

        // Create name column.
    Column<PersonProxy, String> nameColumn = new Column<PersonProxy, String>(
            new EditTextCell()) {
        @Override
        public String getValue(PersonProxy person) {
            String ret = person.getName();
            return ret != null ? ret : "";
        }
    };


    nameColumn.setFieldUpdater(new FieldUpdater<PersonProxy, String>() {            
        @Override
        public void update(int index, PersonProxy object, String value) {
            PersonRequest req = FaceOrgFactory.getInstance().requestFactory().personRequest();
            PersonProxy eObject = req.edit(object);             
            eObject.setName(value);
            req.persist().using(eObject).fire();
        }
    });

およびデータプロバイダーの私のコード:

        AsyncDataProvider<PersonProxy> personDataProvider = new AsyncDataProvider<PersonProxy>() {
        @Override
        protected void onRangeChanged(HasData<PersonProxy> display) {
          final Range range = display.getVisibleRange();

          fetch(range.getStart());
        }
      };
    personDataProvider.addDataDisplay(personTable);

...

private void fetch(final int start) {
    lastFetch = start;
    requestFactory.personRequest().getPeople(start, numRows).fire(new Receiver<List<PersonProxy>>() {
        @Override
        public void onSuccess(List<PersonProxy> response) {
            if (lastFetch != start){
                return;
            }               
            int responses = response.size();

            if (start >= (personTable.getRowCount()-numRows)){                  
                PersonProxy newP = requestFactory.personRequest().create(PersonProxy.class);
                response.add(newP);
                responses++;
            }

            personTable.setRowData(start, response);

            personPager.setPageStart(start);
        }
    });     
    requestFactory.personRequest().countPersons().fire(new Receiver<Integer>() {
        @Override
        public void onSuccess(Integer response) {
            personTable.setRowCount(response+1, true);
        }
    });
}

最後のオブジェクトに新しい空のオブジェクトを挿入しようとしています。そして、ユーザーがそれを入力すると、その後に新しいものを挿入します。しかし、コードは機能していません。ユーザーは、別の RequestContext によって以前に編集されたオブジェクトを編集しようとしていると言います。

ジレンマ:
* あまりにも多くのコンテキストを作成していませんか?
* クライアント側で作成された celltable に新しいオブジェクトを適切に挿入する方法は?
* 編集可能なオブジェクトを取得したときの fieldUpdater で - テーブルに挿入し直すか、それとも忘れるべきですか?

助けてくれてありがとう。

4

1 に答える 1

1
  • コンテキストを作成しすぎていませんか?

はい。

HTTP リクエストごとに ( ごとfire()に) 1 つのコンテキストを持つ必要があり、 fire()d でないコンテキストは役に立ちません (あなた/ユーザーが気が変わって、変更を保存したくない場合にのみそうしてください)。 .
ここで実際に削除するコンテキストは 1 つだけです (以下を参照)。

各フィールドの変更を保存するアプローチは、「競合状態」につながる可能性があることに注意してください。プロキシはedit()、一度に最大 1 つのコンテキストで処理でき、サーバーが応答するまでコンテキストにアタッチされたままになるためです (コンテキストが起動すると、プロキシはサーバーが応答するまで読み取り専用で凍結されます)。
(これはすべての場合に当てはまるわけではありません: onConstraintViolation が呼び出されると、コンテキストとそのプロキシが凍結解除されるため、制約違反を「修正」してコンテキストを再度起動できます。検証はサーバー側で前に行われるため、これは安全です。任意のサービス メソッドが呼び出されます)。

  • クライアント側で作成されたセルテーブルに新しいオブジェクトを適切に挿入する方法は?

コードは問題ないように見えますが、永続化に使用するコンテキストと同じコンテキストでプロキシを作成する必要があります。

  • 編集可能なオブジェクトを取得したときに fieldUpdater で - テーブルに挿入し直すか、それとも忘れるべきですか?

100%確実ではありませんが、テーブルを更新する必要があると思います (のようなものsetRowData(index, Collections.singletonList(object)))

ところで、人々が言及しているドライバーRequestFactoryEditorDriverは、おそらくEditor フレームワークのものです。ここでは役に立ちません (実際にはまったく逆です)。

于 2011-10-11T15:45:28.020 に答える