GWT Автозаполнение или Предложить окно
Я использую подсказку для реализации автозаполнения в GWT. Для извлечения данных из сущности я использую objectify и для отображения данных в поле подсказки я использовал MultiWordSuggestOracle.
При загрузке формы я запускаю запрос для получения данных и передачи их в MultiWordSuggestOracle. Работает нормально.
Например, если я загружаю данные клиента в предложении, это работает
Но, например, если у меня есть 5000 - 50000 записей о клиентах в моей организации, то получить все данные и показать их в предложении не может быть успешно.
Так есть ли другие способы использования автозаполнения в GWT? заранее спасибо
1 ответ
Вместо того, чтобы загружать все записи клиента при загрузке формы, динамически фильтруйте данные на сервере, основываясь на том, что пользователь вводит в SuggestBox
, Вы можете сделать это путем реализации пользовательских SuggestOracle
(возможно продление MultiWordSuggestOracle
).
public class ServerSuggestOracle extends SuggestOracle{
protected DataSource datasource;
protected int startQueryLength;
protected ArrayList<T> suggestions = new ArrayList<T>();
protected boolean isMoreSuggestions = false;
protected int previousQueryLength = 0;
public ServerSuggestOracle(DataSource datasource,int startQueryLength)
{
super();
this.datasource = datasource;
this.startQueryLength = startQueryLength;
}
@Override
public void requestSuggestions(final Request request, final Callback callback) {
// start the backend call only if the user types in more than startQueryLength characters.
if (request.getQuery().length() < startQueryLength)
return;
// if the user expands the search or a serach hasn't been carried out, call the backend. Otherwise filte the existing list
if (isMoreSuggestions || previousQueryLength > request.getQuery().length() || suggestions.size() == 0)
{
datasource.fetchDataFromBackend(request.getQuery(), new FetchDataFromBackendCallback() {
@Override
public void onFetchData(ArrayList<T> genes,Integer count,boolean isMore) {
suggestions.clear();
for (int i = 0;i<genes.size();i++) {
Suggestion suggestion = new Suggestion();
suggestions.add(suggestion);
}
SuggestOracle.Response response = new SuggestOracle.Response(suggestions);
isMoreSuggestions = isMore;
if (count != null)
response.setMoreSuggestionsCount(count);
else
response.setMoreSuggestions(isMore);
previousQueryLength = request.getQuery().length();
callback.onSuggestionsReady(request,response);
}
});
}
else
{
super.requestSuggestions(request,cabllack);
}
}
}