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

Я пытаюсь отобразить дерево категорий, следуя основным примерам 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());
            }
        });
    }

Вопрос в следующем: поскольку у меня нет "свойства листа" в моем bean-компоненте Category, как я могу узнать, есть ли у него дочерние элементы или нет? Выполняя запрос, очевидно, но метод isLeaf должен возвращаться синхронно, как я могу сделать свой вызов rpc?

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

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


person Fabio B.    schedule 22.08.2011    source источник


Ответы (1)


Я бы добавил переходное свойство в класс Categoria, 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 листом, просто проверив его свойство.

person Jason482    schedule 23.08.2011
comment
Наконец, я так и сделал. Следующий вопрос может заключаться в том, где установить различные флаги isLeaf! Ну... в моем методе getCategorie() rpc: - Я получаю все категории - Я зацикливаю каждую категорию и запрашиваю дочерние элементы - Я устанавливаю лист true или false. Неэффективно, не так ли? Как улучшить, на ваш взгляд? - person Fabio B.; 24.08.2011
comment
@ Фабио Б. Я отредактировал свой ответ, чтобы предоставить более полный пример кода. - person Jason482; 24.08.2011