GWT RequestFactory, Editors — работа с древовидными структурами

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

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.

Насколько мне известно, редакторы применимы только непосредственно к сущностям в стиле bean-компонентов. Таким образом, пока работа со свойством 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, поэтому я строю новый, и он терпит неудачу. Каков правильный подход?


person Andrey Agibalov    schedule 03.11.2011    source источник


Ответы (1)


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

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

person Thomas Broyer    schedule 04.11.2011