1

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

我坚持的是确定类别的“叶子”条件。

没有子级的类别“is-a-leaf”,对吗?所以,这是我的类别(我使用 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() 调用中检索“叶子”信息,在运行时填充属性,但这可能是一个性能问题。

我能做些什么?

4

1 回答 1

0

我将向 Categoria 类添加一个瞬态属性 a boolean isLeaf,然后在setParent方法内部,您可以将父isLeaf属性设置为 false (因为如果thisobject 的父级为that,则thatobject 不是叶子)。使属性瞬态意味着它不会被持久化,因此您不必担心在数据模型中有该字段。

编辑:这是我将如何编写Categoria类的setParent方法...

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

这样,一旦你建立了Categoria节点模型,每个节点都知道它是否是叶子。这是有效的,因为如果parentthis作为一个孩子,parent不可能是一片叶子。isLeaf将属性默认为,您只需检查其属性true即可知道任何给定的是否为叶子。Categoria

于 2011-08-23T13:34:34.433 回答