2

編集可能なグリッドを実装し、フィールド アップデーターを使用してモデル値を更新しました。モデル全体をデータベースに直接保存できるため、データベースへの保存は問題ありません。問題はキャンセルまたはエスケープをクリックすることです。古い値に戻したいのですが、同じことを達成できません。どのようにそれを行うかについてのアイデアはありますか?

注: 変更が行われるたびに、モデルを更新しています

1) キャンセルをクリックして別の非同期呼び出しを行いたくありません。

2)クローン作成と保存メカニズムを本当に避けたい。

現在GWT 2.4.0を使用しています

column.setFieldUpdater(new FieldUpdater<Abc, String>() {
  @Override
  public void update(Abc object, String value) {
    object.set(value);
    table.redraw();
  }
});
4

3 に答える 3

1

Showcase の Cell Sample を見てください。変更がキューに入れられ、後でそれらを基になるモデルに「コミット」できます。変更をキャンセルするには、キューをクリアし、編集clearViewDataされた項目ごとに各セルを呼び出して、編集された値を忘れるようにします。

于 2012-04-23T11:28:18.313 に答える
0

clearViewDataThomas が提案するように、キー プロバイダーと呼び出しが必要です。キープロバイダーがない場合は値をキーとして使用できるとどこかで読みましたが、それはうまくいきませんでした。

  private static final int MAX_AGE = 150;

  private static class Contact {
    public String name;
    public String address;
    public int age;
  }

  private static final ProvidesKey<Contact> KEY_PROVIDER = new ProvidesKey<Contact>() {
    @Override
    public Object getKey(Contact row) {
      return row.name; // assuming names are unique
    }
  };

  public void onModuleLoad() {
    table = new CellTable<Contact>(KEY_PROVIDER);
    ....

    final TextInputCell ageCell = new TextInputCell();
    Column<Contact, String> ageColumn = new Column<Contact, String>(ageCell) {
      @Override
      public String getValue(Contact row) {
        return String.valueOf(row.age);
      }
    };
    ageColumn.setFieldUpdater(new FieldUpdater<Contact, String>() {
      @Override
      public void update(int index, Contact row, String value) {
        try {
          int intVal = Integer.parseInt(value.trim());
          if (intVal < 0 || intVal > MAX_AGE) {
            throw new NumberFormatException();
          }
          row.age = intVal;
        } catch (NumberFormatException e) {
          ageCell.clearViewData(KEY_PROVIDER.getKey(row));
        }
        table.redraw();
      }
    });

    ...
    table.addColumn(ageColumn, "Age");
  }
于 2012-12-12T18:38:06.250 に答える