我正在尝试按照基本的CellTree gwt示例显示类别树。

我所坚持的是确定类别的“叶子”状况。

一个没有孩子的类别是“叶子”,对吗?因此,这是我的类别(我正在使用Objectify来实现appengine持久性):

@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()调用中检索“叶”信息,在运行时填充属性,但这可能是性能问题。

我能做什么?

最佳答案

我会在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是否是叶子。

07-28 02:49