Я использую GWT 2.1's CellBrowser с обычным TreeViewModel
. TreeViewModel в свою очередь использует AsyncDataProvider
для получения данных динамически. Все это прекрасно работает - когда пользователь нажимает на узел, мой AsyncDataProvider извлекает результаты через RPC, и CellBrowser покорно отображает их.GWT: Как программно перезагрузить CellBrowser?
Я чувствую себя глупо, что не могу понять это, но как я могу программным образом сказать CellBrowser перезагрузить (и отобразить) данные? Я предполагаю, что мне нужно как-то получить дескриптор AsyncDataProvider для моего корневого узла, а затем вызвать updateRowData() & updateRowCount(), но я не вижу очевидного способа запроса браузера (или его модели) для корневого DataProvider.
Я думаю, что я мог бы добавить код в свой конструктор AsyncDataProvider, который ищет нулевой аргумент, и тем самым распознает «эй, я корень» и где-то храню ссылку, но это кажется хакерским. Конечно, есть лучший способ сделать это.
Извините за то, что вы свалили столько кода, но я не знаю, как это свернуть до чего-нибудь более простого и по-прежнему обеспечить достаточный контекст.
Мой AsyncDataProvider:
private static class CategoryDataProvider extends AsyncDataProvider<Category>
{
private Category selectedCategory;
private CategoryDataProvider(Category selectedCategory)
{
this.selectedCategory = selectedCategory;
}
@Override
protected void onRangeChanged(HasData<Category> display)
{
new AsyncCall<List<Category>>()
{
@Override
protected void callService(AsyncCallback<List<Category>> 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<Category> result)
{
// update the display
updateRowCount(result.size(), true);
updateRowData(0, result);
}
}.go();
}
}
Моя модель:
private static class CategoryTreeModel implements TreeViewModel
{
private SingleSelectionModel<Category> selectionModel;
public CategoryTreeModel(SingleSelectionModel<Category> selectionModel)
{
this.selectionModel = selectionModel;
}
/**
* @return the NodeInfo that provides the children of the specified category
*/
public <T> 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<Category>(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);
опечатка на «HashRefresh», но в остальном +1! :) – HaveAGuess
Почему все голосуют за этот ответ? Тот, который ниже, намного лучше - однострочное изменение, которое делает все это. –
updateRowData (start, response.getEntities()) обновляет все дисплеи для провайдера, вместо этого вы можете использовать updateRowData (display, start, response.getEntities()). Но display.setVisibleRangeAndClearData (display.getVisibleRange(), true) все еще лучше :) – Quiz