Gwt CellTree isLeaf () проблема - PullRequest
       12

Gwt CellTree isLeaf () проблема

1 голос
/ 22 августа 2011

Я пытаюсь отобразить дерево категорий, следуя базовым примерам CellTree gwt.

Я застрял в определении "листового" состояния категории.

AКатегория "это лист", когда нет детей, верно?Итак, вот моя категория (я использую 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());
            }
        });
    }

Вопрос: поскольку у меня нет «свойства листа» в моем компоненте категории, как я могу узнать, есть ли у него дети или нет?Выполняя запрос, очевидно, но метод isLeaf должен возвращаться синхронно, как я могу сделать мой вызов RPC?

Или я могу получить эту «листовую» информацию в вызове getCategorie (), заполняя свойство во время выполнения, но это может быть проблемой производительности.

Что я могу сделать?

1 Ответ

0 голосов
/ 23 августа 2011

Я бы добавил временное свойство к классу Категории, boolean isLeaf, а затем внутри метода setParent можно было бы установить для свойства isLeaf родителя значение false (поскольку, если у объекта this есть родительский элемент that, то that объект не лист). Переходное свойство означает, что оно не будет сохраняться, поэтому вам не нужно беспокоиться о наличии этого поля в вашей модели данных.

РЕДАКТИРОВАТЬ: Вот как я бы закодировал setParent метод Categoria класса ...

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

Таким образом, как только вы построите свою модель Categoria узлов, каждый из них будет знать, является ли это листом или нет. Это работает, потому что если parent имеет this в качестве ребенка, parent не может быть листом. По умолчанию для свойства isLeaf установлено значение true, и вы узнаете, является ли данный Categoria листом, просто проверив его свойство.

...