2011-11-03 137 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()值,這是導致錯誤的原因)。