1

基本的なCellTreegwtの例に従って、カテゴリのツリーを表示しようとしています。

私が立ち往生しているのは、カテゴリの「葉」の状態を判断することです。

子供がいない場合のカテゴリ「葉っぱ」ですね。だから、これが私のカテゴリーです(私はappengineの永続性のためにObjectifyを使用しています):

@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に「leafproperty」がないので、子があるかどうかをどうやって知ることができるかということです。明らかにクエリを実行しますが、isLeafメソッドは同期的に戻る必要がありますが、どうすればrpc呼び出しを行うことができますか?

または、getCategorie()呼び出しでその「リーフ」情報を取得して、実行時にプロパティを埋めることができますが、これはパフォーマンスの問題である可能性があります。

私に何ができる?

4

1 に答える 1

0

一時的なプロパティをCategoriaクラスに追加しboolean isLeaf、メソッド内で親のプロパティをfalseにsetParent設定できます(オブジェクトにの親がある場合、オブジェクトはリーフではないため)。プロパティを一時的にすると、プロパティが永続化されないため、データモデルにそのフィールドがあることを心配する必要はありません。isLeafthisthatthat

編集:これが私がCategoriaクラスのsetParentメソッドをコーディングする方法です...

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

このようにして、ノードのモデルを構築すると、Categoriaノードのそれぞれがそれがリーフであるかどうかを認識します。これが機能するのは、子供としてparent持っている場合、おそらく葉になることはできないからです。プロパティをデフォルトに設定すると、プロパティをチェックするだけで、指定されたものがリーフであるかどうかがわかります。thisparentisLeaftrueCategoria

于 2011-08-23T13:34:34.433 に答える