2011-11-03 33 views
1

工作比方说,我们有一个域实体定义是这样的:GWT RequestFactory,编辑 - 用树状结构

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 web应用程序与这些实体的工作。我正在使用请求工厂和编辑器框架。我有一些确定的问题:-)

由于请求工厂的定义是微不足道的,我不会在这里发布它们。我只能说所有与孩子有关的东西都是一组InstanceRequest s。

那么,问题#1

比方说,我们希望有整个树导航。这个想法是,每次我们只看到一个节点,我们可以导航到它的父节点或其子节点。我们希望此导航器使用编辑器框架,因此我们构建编辑器如MyNodeEditorChildrenListEditor

据我所知,编辑只能直接适用于豆式实体。所以,只要与MyNodetext属性无关,使用children属性(ChildrenListEditor)需要实例请求。

我的解决方案是,使MyNodeEditorValueAwareEditor,当它获取其值设置时,它会启动InstanceRequest以获取子节点的列表。该列表然后绑定到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”因为我有同一实体的两个不同的请求这里。我没有访问RequestContext我在MyNodeEditor构建,所以我正在构建新的,它失败。什么是正确的方法?

回答

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

  2. 您可以通过在您的编辑器上执行HasRequestContext来访问您通过RequestFactoryEditorDriverRequestContext。但是在这种情况下,它不会帮助你,因为从你的编辑器中启动它会冻结它,从而使它无法用于其他任何事情(例如在刷新编辑器驱动程序后保存节点)。如果您无法将getChidren添加到您的MyNodeProxy,那么我建议您在编辑器驱动程序中编辑节点之前先获取儿童列表(也可以使用基于节点ID的请求,而不是将节点实例作为参数,或者作为using()值,这是导致错误的原因)。