В Gwt TreeViewModel метод getNodeInfo () - PullRequest
       302

В Gwt TreeViewModel метод getNodeInfo ()

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

Я не могу понять эту часть, ни пример демонстрационных примеров.

Я использую расширение AsyncDataProvider для привязки моего дерева к службе RPC. Вот мой метод:

public <T> NodeInfo<?> getNodeInfo(T value) {
        /*
        if (value instanceof Categoria) {
            dataProvider.setCurrentParent((Categoria)value);
        }
        */
        return new DefaultNodeInfo<Categoria>(dataProvider, new CategoriaCell());
    }

«currentParent» - мой материал: за исключением значений (null => root), я устанавливаю родительский параметр для передачи через RPC моему сервису. Собственно, в моем коде виджета:

dataProvider = new CategorieTreeDataProvider() {            
            @Override
            protected void onRangeChanged(HasData<Categoria> display) {
                updateTree(getCurrentParent());
            }
        };

private void updateTree(Categoria categoria) {
        rpcService.getCategorie(categoria, 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());
            }
        });
    }

Однако мой код rpc-сервера работает должным образом:

@Override
    public Categoria[] getCategorie(Categoria parent) {
        List<Categoria> categoryList = categorieDao.listByProperty("parent", parent);
        for (Categoria c : categoryList) {
            if (categorieDao.listByProperty("parent", c).size() == 0) {
                c.setLeaf(true);
            }
        }
        return categoryList.toArray(new Categoria[0]);
    }

** Затем я добавляю некоторые данные в мои категории: «Дед», «Отец» и «Сын».

К сожалению, после загрузки моего виджета я вижу:

  • Дедушка правильно, с его "+", как и ожидалось;

  • Затем я нажимаю на нее и ...

  • Дед исчезает, и я вижу "Отца" с его "+"

  • то же самое для отца -> сын

Я подозреваю, что ошибка в использовании updateRowCount / updateRowData. **

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 25 августа 2011

getNodeInfo вызывается всякий раз, когда вы открываете узел, поэтому вам нужно создать отдельный DataProvider для каждого из дочерних узлов.

public <T> NodeInfo<?> getNodeInfo(T value) {
        if (value == null) {
            return new DefaultNodeInfo<Category>(dataProvider, new CategoriaCell());
        }
        else if (value instanceof Categoria) {
                 Category category  = (Category)value;
             return new DefaultNodeInfo<Grandfather>(new ListDataProvider<Grandfather>(category.getGrandFathers()),new GrandFatherCell());
        }
        else if (value instanceof Grandfather) {
             Grandfather grandfather = (Grandfather)value;
             return new DefaultNodeInfo<Father>(new ListDataProvider<Father>(granfather.getFathers()),new FatherCell());
        }
        else if (value instanceof Father) {
            //same as above but with fathers.
        }
    }

Функция category.getGrandFathers () может, например, сделать запрос RPC серверу или просто вернуть список, если вы получаете все в одном запросе RPC.

ОБНОВЛЕНИЕна основе комментария:

Таким образом, если у вас есть только один класс и вы хотите получить динамическое CellTree (количество уровней не определено заранее), вы можете воспользоваться следующим подходом.

public <T> NodeInfo<?> getNodeInfo(T value) {
    if (value == null) {
        return new DefaultNodeInfo<Category>(dataProvider, new CategoriaCell());
    }
    else {
        Category category  = (Category)value;
        return new DefaultNodeInfo<Category>(new ListDataProvider<Category>(category.getSubCategories()),new CategoryCell());
    }
}

category.getSubCategories () является либо вызовом RPC, который извлекает подкатегории для текущей категории, либо, если класс Category является структурой типа связанного типа списка, он может просто вернуть список подкатегорий.

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

Каждый поставщик данных обновляет заданный «список» (дочерние узлы данного родительского узла), поэтому вы должны использовать отдельный экземпляр поставщика данных для каждого родительского узла, иначе ваши вызовы обновят некоторый случайный список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...