Я схожу с ума от компонента автозаполнения Kendo UI. Я использую свои собственные функции для доступа к данным с помощью jQuery, поэтому мне нужно установить AutoComplete dataSource.transport.read как функцию. Код примерно такой.

minLengthAtocomplete = 3;

$('#autocomplete').kendoAutoComplete({
    minLength : 3,
    filter : "contains",
    dataValueField : "key",
    dataTextField : "value",
    dataSource : new kendo.data.DataSource({
        transport : {
            read : _OnTransportRead
        },
        schema : {
            /* object schema */
        }
    })
});

function _OnTransportRead(e) {
    var text = $.trim(e.data.filter.filters[0].value);

    if (text && text.length >= minLengthAtocomplete) {
        _GetUsers(
            text,
            function onSuccess(data) {
                var users = [];
                 /* sets users with info in data */
                e.success(users);
            },
            function onError(error) {
                /* stuff with error */
            }
        );
    }
}

function _GetUsers(userName, onSuccess, onError) {
    /* Ajax to get users from DB */
}

Этот код работает отлично, но dataSource.transport.read вызывается только один раз. Я выполняю первый поиск с текстом 'michae' , и компонент AutoComplete запускает свой dataSource.transport.read, как ожидалось. Затем я добавляю еще одну букву для поиска 'michael' , и dataSource.transport.read больше никогда не вызывается. Так обидно!

Я попытался использовать свойство autoSync dataSource, ручную синхронизацию источника данных, установить новые объекты dataSource в AutoComplete dataBound, но не повезло.

Что я делаю не так? Что я забываю?

Заранее спасибо.

14
vermicida 24 Сен 2012 в 11:39
Я запустил точный код, приведенный выше, и получаю сообщение об ошибке, в котором указано, что e.data.filter не определено.
 – 
Vivian River
21 Июн 2018 в 23:50

1 ответ

Лучший ответ

Вы должны включить serverFiltering, чтобы источник данных каждый раз отправлял запросы.

$('#autocomplete').kendoAutoComplete({
    minLength : 3,
    filter : "contains",
    dataValueField : "key",
    dataTextField : "value",
    dataSource : new kendo.data.DataSource({,
        serverFiltering: true, 
        transport : {
            read : _OnTransportRead
        },
        schema : {
            /* object schema */
        }
    })
});
26
Iman Mahmoudinasab 10 Окт 2013 в 12:23
1
Это потрясающе! Автозаполнение теперь работает как шарм! Я потратил много времени на это, я сходил с ума! Большое спасибо!
 – 
vermicida
26 Сен 2012 в 00:17
Здесь та же проблема, и решение было очень полезным!
 – 
HapiDjus
26 Авг 2013 в 20:38