Я использую GWT 2.1 CellBrowser с пользовательской TreeViewModel
. TreeViewModel, в свою очередь, использует AsyncDataProvider
для динамического извлечения данных. Все это прекрасно работает - когда пользователь нажимает на узел, мой AsyncDataProvider получает результаты через RPC, а CellBrowser послушно их отображает.
Я чувствую себя глупо из-за того, что не могу это понять, но как я могу программно сообщить CellBrowser перезагрузить (и отобразить) данные? Я предполагаю, что мне нужно каким-то образом получить дескриптор AsyncDataProvider для моего корневого узла, а затем вызвать на нем updateRowData () и updateRowCount (), но я не вижу очевидного способа запросить браузер (или его модель) для корневого DataProvider.
Думаю, я мог бы добавить код в свой конструктор AsyncDataProvider, который ищет нулевой аргумент, и тем самым распознает «эй, я корень» и где-то храню ссылку, но это кажется хакерским. Конечно, есть лучший способ сделать это.
Приношу свои извинения за сброс такого количества кода, но я не знаю, как свести это к чему-то более простому и при этом обеспечить достаточный контекст.
My AsyncDataProvider:
private static class CategoryDataProvider extends AsyncDataProvider
{
private Category selectedCategory;
private CategoryDataProvider(Category selectedCategory)
{
this.selectedCategory = selectedCategory;
}
@Override
protected void onRangeChanged(HasData display)
{
new AsyncCall>()
{
@Override
protected void callService(AsyncCallback> cb)
{
// default to root
String categoryId = "-1";
if (selectedCategory != null)
{
categoryId = selectedCategory.getCategoryId();
}
// when a category is clicked, fetch its child categories
service.getCategoriesForParent(categoryId, cb);
}
@Override
public void onSuccess(List result)
{
// update the display
updateRowCount(result.size(), true);
updateRowData(0, result);
}
}.go();
}
}
My модель:
private static class CategoryTreeModel implements TreeViewModel
{
private SingleSelectionModel selectionModel;
public CategoryTreeModel(SingleSelectionModel selectionModel)
{
this.selectionModel = selectionModel;
}
/**
* @return the NodeInfo that provides the children of the specified category
*/
public NodeInfo> getNodeInfo(T value)
{
CategoryDataProvider dataProvider = new CategoryDataProvider((Category) value);
// Return a node info that pairs the data with a cell.
return new TreeViewModel.DefaultNodeInfo(dataProvider, new CategoryCell(), selectionModel, null);
}
/**
* @return true if the specified category represents a leaf node
*/
public boolean isLeaf(Object value)
{
return value != null && ((Category) value).isLeafCategory();
}
}
И, наконец, вот как я их использую:
CategoryTreeModel model = new CategoryTreeModel(selectionModel);
CellBrowser cellBrowser = new CellBrowser(model, null);