2012-05-15 4 views
2

У меня есть приложение типа браузера файлов, состоящее из CellTree, отображающего иерархию и панель браузера, отображающую содержимое текущего узла.Открыть дерево ячеек GWT для определенного узла

Приложение должно обрабатывать иерархии, которые могут быть слишком большими для эффективного управления CellTree, поэтому местоположение, отображаемое в панели браузера, не сильно связано с открытыми узлами в дереве.

Я хочу реализовать кнопку, которая откроет текущее местоположение обзора в CellTree. Моя модель данных на стороне сервера имеет родительские/дочерние ссылки на всех объектах, поэтому получение иерархии - это простой вопрос, но я борюсь с тем, как применить это к дереву.

Это моя текущая попытка, это метод виджета, который содержит мое дерево, и вызывается из приемника. Каждый объект RecordTreeLevel представляет собой уровень в дереве.

public void navigateTo(List<RecordTreeLevelProxy> hierarchy) { 
    TreeNode currentNode = tree.getRootTreeNode(); 

    ListIterator iter = hierarchy.listIterator(hierarchy.size()); 

    while (iter.hasPrevious()){ 
     RecordTreeLevelProxy level = (RecordTreeLevelProxy) iter.previous(); 
     Integer nodeIndex = locateNode(level.getUniqueRef(), currentNode); 
     if (nodeIndex != null){ 
      currentNode = currentNode.setChildOpen(nodeIndex, true, true); 
     } 
    } 
} 

Это не работает, потому что цикл завершается в entirity, прежде чем дети будут добавлены к любому из узлов. Поэтому узел первого уровня открывается так, как должен, но не имеет детей, когда цикл появляется во второй раз.

Я не могу не чувствовать, что мне не хватает чего-то очевидного или делаю это неправильно, но я не вижу этого. Любая помощь очень apprieciated (даже если это сказать «не глупо, вы не можете сделать это таким образом)

ответ

5

Ваш код должен работать если вы заполнить данные синхронно от вашего TreeViewModel (при условии, что делает locateNode Я думаю, что это делает, т.е. перебрать currentNode.getChildValue(i) с i между 0 и currentNode.getChildCount()).

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

Например, для следующего дерева:

- A 
    +- A1 
    +- A1a 
    +- A2 
    +- A2a 
    +- A2b 
- B 
    +- B1 
    +- B2 

Если узел А2а должен быть предварительно выбранным, я начать с нагрузкой корневой ветви, A ветвь, потом A2 ветвь:

<root> -> [ A, B ] 
A  -> [ A1, A2 ] 
A2  -> [ A2a, A2b ] 

Таким образом, я уверен, что мой TreeViewModel будет работать синхронно для узлов <root>, A и A2.

И тогда только я запускаю код setChildOpen. Поскольку TreeViewModel является синхронным для этих узлов, setChildOpen возвращает ненулевое значение.

+0

Спасибо за ваш быстрый ответ. Томас, я думаю, что это в значительной степени то, что мне нужно делать. Как вы получаете TreeViewModel для синхронного запуска для кэшированных данных и async в противном случае? Используете ли вы пользовательский поставщик данных? –

+0

также верно ваше предположение о функции locateNode, это именно то, что он делает.Вероятно, я должен был объяснить это в первую очередь. –

+0

Теперь у меня это работает, изменив метод onRangeChange на моем dataprovider для проверки кеша на стороне клиента, прежде чем отправиться на сервер, ищущий данные. Большое спасибо еще раз за ваше ясное и консилиальное описание Томаса, это действительно помогло мне. –

Смежные вопросы