1

假设我们有一个这样定义的域实体:

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 网络应用程序来处理这些实体。我正在使用请求工厂和编辑器框架。而且我肯定会遇到一些问题:-)

由于请求工厂的定义很简单,我不会在这里发布它们。我只想说所有与孩子有关的东西都是一组InstanceRequests。

所以,问题#1

假设我们想要为整棵树创建一个导航器。这个想法是,每次我们只看到一个节点时,我们可以导航到它的父节点或它的一个子节点。我们希望这个导航器使用编辑器框架,所以我们构建了像MyNodeEditorand之类的编辑器ChildrenListEditor

据我所知,编辑器仅直接适用于 bean 样式的实体。因此,只要使用MyNode text属性没问题,使用children属性 ( ChildrenListEditor) 就需要实例请求。

我的解决方案是, makeMyNodeEditor成为 a ValueAwareEditor,当它设置它的值时,它会启动 anInstanceRequest以获取子节点列表。然后该列表绑定到ChildrenListEditor.

有没有更简单的解决方案?我相信这是一个非常基本的场景。

问题 #2

我们现在决定让我们MyNodeEditor的编辑能力。bean 样式的属性又好了,但是孩子呢?使用问题 #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:尝试编辑以前由另一个 RequestContext 编辑的 EntityProxy”,因为我在这里对同一实体有 2 个不同的请求。我无权访问RequestContext我在 at 构建的MyNodeEditor,所以我正在构建新的,但它失败了。什么是正确的方法?

4

1 回答 1

1
  1. 如果你有一个List<MyNodeProxy> getChildren()属性MyNodeProxy来访问孩子,而不是发出一个不同的请求,那会更容易。

  2. 您可以通过在您的编辑器上实现来访问RequestContext您传递给的。但在这种情况下,它不会帮助您,因为(从您的编辑器中)触发它会冻结它,从而使其无法用于其他任何事情(例如在刷新编辑器驱动程序后保存节点)。如果您无法将 a 添加到您的中,那么我建议您在编辑器驱动程序中编辑节点之前获取子列表(或者,您可以使用基于节点 ID 的请求,而不是将节点实例作为参数传递,或作为一个值,这是导致错误的原因)。RequestFactoryEditorDriverHasRequestContextgetChidrenMyNodeProxyusing()

于 2011-11-04T02:15:55.730 回答