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);
        }
    }

}
Другие вопросы по тегам