2011-08-22 64 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