Как отредактировать значение ValueProxy gwt requestfactory на стороне клиента?

У меня есть 2 модели: ContactGroup и Contact. ContactGroup содержит много контактов.

На странице мне нужно отобразить список групп и количество контактов в группе корреспонденции следующим образом:

  • Группа Foo (12 контактов)
  • Групповой бар (20 контактов)

Так что я на стороне сервера я использовал DTO ContactGroupInfo:

public class ContactGroupInfo {
    private Integer contactCount;
    private Long id;
    private String name;

    public Integer getContactCount() { return this.contactCount; }
    public Long getId() { return this.id; }
    public String getName() { return this.name; }
    public void setContactCount(Integer count) { this.contactCount = count; }
    public void setId(Long id) { this.id = id; }
    public void setName(String name) { this.name = name; }
}

В этом ContactGroupInfo я добавил поле contactCount, которое не является полем в сущности ContactGroup.

А на стороне клиента я использовал ValueProxy:

@ProxyFor(value = ContactGroupInfo.class, locator = ContactGroupService.class)
public interface LightContactGroupProxy extends ValueProxy {
    Integer getContactCount();
    Long getId();
    String getName();
    void setContactCount(Integer count);
    void setId(Long id);
    void setName(String name);
}

Поэтому, когда серверная сторона возвращает клиентской стороне список LightContactGroupProxy, я сохранял этот список в ArrayList для отображения в CellTable.

И тут возникает проблема: когда мне нужно отредактировать имя группы на стороне клиента, я не могу редактировать объект LightContactGroupProxy напрямую.

  • Поэтому я должен отправить новое имя на сервер, чтобы вернуть новый LightContactGroupProxy с новым именем. Это неэффективно, потому что мне приходится снова считать контакты (хотя я знаю, что количество контактов не меняется).
  • Или я должен отправить количество контактов и новое имя на сервер, чтобы создать новый LightContactGroupProxy с новым именем. Это не я хочу, потому что, если LightContactGroupProxy имеет много других полей, я должен отправить много полей.

Я не знаю, почему команды GWT проектируют неизменный прокси. Так что, пожалуйста, у кого-то есть опыт в запросе. Пожалуйста, покажите мне правильный способ обработки ValueProxy, возвращенного с сервера, чтобы мы могли использовать их для рендеринга и редактирования?

Спасибо

1 ответ

Решение

Может быть, вы должны попробовать что-то вроде этого:

ContactGroupContext ctx = requestFactory.newContactGroupContext();
LightContactGroupProxy editableProxy = ctx.edit(lightContactGroupProxy);
editableProxy.setName(newName);
ctx.saveInfoAndReturn(editableProxy).fire(receiver); // or just ctx.fire();

Во всяком случае, я бы не стал использовать ValueProxy в этом случае я бы получил ContactGroup лица с транзитной собственностью contactCount, Свойство может быть примитивным или ValueProxy если вы не хотите, чтобы он рассчитывался каждый раз ContactGroup запрашивается.

Другие вопросы по тегам