我正在尝试按照基本的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
节点模型,每个节点便知道它是否是叶子。之所以起作用,是因为如果parent
以this
作为子级,则parent
不可能是叶子。将isLeaf
属性默认设置为true
,仅通过检查其属性即可知道给定的Categoria
是否是叶子。