GWT RequestFactory, Editors - работа с древовидными структурами - PullRequest
1 голос
/ 03 ноября 2011

Допустим, у нас есть сущность домена, определенная следующим образом:

interface MyNode {
  MyNode getParent();
  void setParent(MyNode node);

  List<MyNode> GetChildren();
  void AddChild(MyNode node);
  void RemoveChild(MyNode node);

  String getText();
  void setText(String text);
}

Я пытаюсь реализовать веб-приложение GWT для работы с этими объектами. Я использую фабрику запросов и редакторы фреймворков. И у меня наверняка есть некоторые проблемы: -)

Поскольку определения фабрики запросов тривиальны, я не буду размещать их здесь. Я бы сказал, что все, что связано с детьми, - это набор InstanceRequest с.

Итак, проблема № 1

Допустим, мы хотим иметь навигатор для всего дерева. Идея в том, что каждый раз, когда мы видим только один узел, мы можем либо перейти к его родителю, либо к одному из его дочерних узлов. Мы хотели бы, чтобы этот навигатор использовал каркас редакторов, поэтому мы создаем редакторы, такие как MyNodeEditor и ChildrenListEditor.

Насколько я знаю, редакторы имеют прямое отношение только к объектам в стиле бобов. Таким образом, если работа со свойством MyNode text в порядке, работа со свойством children (ChildrenListEditor) требует запроса экземпляра.

Мое решение состоит в том, чтобы сделать MyNodeEditor равным ValueAwareEditor, и когда он получит свое значение, он инициирует InstanceRequest, чтобы получить список дочерних узлов. Этот список затем связан с ChildrenListEditor.

Есть ли более простые решения? Я считаю, что это довольно простой сценарий.

Задача № 2

Теперь мы решили сделать наш MyNodeEditor способным к редактированию. Свойства в стиле бобов снова хороши, но как насчет детей? Используя код, указанный в задаче № 1:

@Override public void setValue(MyNodeProxy value) {
  ...
  requestFactory.myNodeRequest().getChildNodes().using(value).fire(new Receiver<List<MyNodeProxy>>() {
        @Override public void onSuccess(List<MyNodeProxy> response) {
            childrenDriver.display(response);
        }           
    });
  ...
}

вызывает «Причина: java.lang.IllegalArgumentException: Попытка отредактировать EntityProxy, ранее отредактированный другим RequestContext», потому что у меня есть 2 различных запроса для той же самой сущности здесь. У меня нет доступа к RequestContext, который я создал в MyNodeEditor, поэтому я создаю новый, и он не работает. Какой правильный подход?

1 Ответ

1 голос
/ 04 ноября 2011
  1. Было бы проще, если бы у вас было List<MyNodeProxy> getChildren() свойство в MyNodeProxy для доступа к детям, вместо того, чтобы выдавать отдельный запрос.

  2. Вы можете получить доступ к RequestContext, который вы передали RequestFactoryEditorDriver, внедрив HasRequestContext в вашем редакторе. Но в этом случае это вам не поможет, так как запуск (из вашего редактора) заморозит его и, таким образом, сделает его непригодным для чего-либо еще (например, сохранение узла после сброса драйвера редактора). Если вы не можете добавить getChidren к своему MyNodeProxy, я бы посоветовал получить список детей до того, как вы отредактируете узел в драйвере редактора (в качестве альтернативы вы можете использовать запрос на основе идентификатора узла, а не передавать экземпляр узла в качестве аргумента или как значение using(), которое и является причиной ошибки).

...