2011-08-22 69 views
1

我試圖顯示一個分類樹,下面是基本的CellTree gwt示例。Gwt CellTree isLeaf()問題

我堅持的是確定一個類別的「葉」條件。

當它沒有孩子的時候,是一個類別「is-a-leaf」,對吧?所以,這裏是我的類別(我用客觀化應用服務引擎的持久性):

@Entity 
public class Categoria implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    Long id; 

    String nome;  
    Key<Categoria> parent; 

    public Categoria() { } 

    public Categoria(String nome) { 
     super(); 
     this.nome = nome; 
    } 

    public String getNome() { 
     return nome; 
    } 

    public void setNome(String nome) { 
     this.nome = nome; 
    } 

    public Key<Categoria> getParent() { 
     return parent; 
    } 

    public void setParent(Key<Categoria> parent) { 
     this.parent = parent; 
    } 
} 

我TreeViewModel基於AsyncDataProvider(這是我從外面傳):

public class CategorieTreeViewModel implements TreeViewModel { 

    private AbstractDataProvider<Categoria> dataProvider; 

    public CategorieTreeViewModel(AbstractDataProvider<Categoria> dataProvider) { 
     this.dataProvider = dataProvider; 
    } 

    @Override 
    public <T> NodeInfo<?> getNodeInfo(T value) { 
     return new DefaultNodeInfo<Categoria>(dataProvider, new CategoriaCell()); 
    } 

    @Override 
    public boolean isLeaf(Object value) { 
     return false; 
    } 
} 

所以在這裏,它是:

dataProvider = new AsyncDataProvider<Categoria>() {   
      @Override 
      protected void onRangeChanged(HasData<Categoria> display) { 
       updateTree(); 
      } 
     }; 

private void updateTree() { 
     rpcService.getCategorie(new AsyncCallback<Categoria[]>() { 
      @Override 
      public void onSuccess(Categoria[] result) { 
       dataProvider.updateRowCount(result.length, true); 
       dataProvider.updateRowData(0, Arrays.asList(result)); 
      } 
      @Override 
      public void onFailure(Throwable caught) { 
       Window.alert(caught.toString()); 
      } 
     }); 
    } 

問題是:因爲我的Category bean沒有「葉子屬性」,我怎麼知道它是否有孩子?通過顯式查詢,但isLeaf方法需要同步返回,我怎樣才能使我的rpc調用?

或者我可以檢索getCategorie()調用中的「葉子」信息,在運行時填充屬性,但這可能是性能問題。

我該怎麼辦?

回答

0

我會一過性屬性添加到Categoria類,一boolean isLeaf,那麼setParent方法中,你可以在父母的isLeaf屬性設置爲false(因爲如果this對象有that父母,然後that對象不是葉)。使屬性瞬變意味着它不會被持久化,所以你不必擔心數據模型中有這個字段。

編輯:這是我會怎樣編寫的Categoria類的setParent方法...

public void setParent(Key<Categoria> parent) { 
    this.parent = parent; 
    parent.setIsLeaf(false); 
} 

這樣一來,一旦你已經建立了你的Categoria節點的模型,他們每個人都知道它是否是一個是否葉。這是有效的,因爲如果parentthis作爲孩子,parent不可能是一片葉子。默認isLeaf財產true,你會知道如果任何給定Categoria是一個葉子只是通過檢查它的屬性。

+0

最後,我這樣做了。下一個問題可能是在哪裏設置各種isLeaf標誌!那麼...在我的getCategorie()rpc方法: - 我檢索所有類別 - 我循環每個類別和查詢兒童 - 我設置葉真或假。不方便,不是嗎?在你看來如何改進? –

+0

@Fabio B.我編輯了我的答案以提供更完整的代碼示例。 – Jason482