Почему parameterMap не вызывает kendoGrid?

#kendo-ui #kendo-grid

Вопрос:

имейте следующую сетку кендо:

 this.kGrid = $element.kendoGrid({
columns: [
    { field: 'Title' },
    { field: 'Description' },
    {
        field: 'StartDate',
        title: 'Start Date',
        template: `#= kendo.toString(kendo.parseDate(DistributionDate), "${DATE_FORMAT} ${TIME_FORMAT}")#`,
    }
],
filterable: true,
dataSource: {
    type: 'aspnetmvc-ajax',
    transport: {
        read: {
            url: '/Pubs/GetPubs',
            dataType: "json",
            type: 'POST',
            data: () => ({
                collectionId: this.selectedCollection,
                categoryUid: this.selectedCategory
            })
        },
        parameterMap: function (data, type) {
            //i wawnt to add some logic here to convert StartDate from local time to UTC
        }
    },
    serverFiltering: true,
    schema: {
        data: 'Data',
        total: 'Total',
        model: {
            id: 'Uid',
            fields: {
                Title: { type: 'string' },
                Description: { type: 'string' },
                StartDate: { type: 'date' }
            }
        }
    }
}
}).data('kendoGrid');
 

Итак, у меня есть сетка с 3 столбцами, и все они поддаются фильтрации. Моя цель-преобразовать дату в фильтре для даты начала с местного времени в UTC. Вот почему я добавил обработчик отображения параметров. Но по какой-то причине метод parameterMap вообще не вызывается. Что я здесь делаю не так?
Вот полный фрагмент кода — https://dojo.telerik.com/IqadArAn/3. Но проблема здесь не воспроизводима

РЕДАКТИРОВАТЬ: Похоже, проблема в типе источника данных, который является «aspnetmvc-ajax». Если изменить тип источника данных, parameterMap работает.

Комментарии:

1. можете ли вы привести пример

2. Если вы добавите console.log(data) внутри своей карты параметров, появится ли что-нибудь в вашей консоли?

3. @Дэвид, нет, консоль чиста. Также пытался установить точку останова внутри карты параметров, но она так и не сработала.

4. @dev_in_progress, какой пример вы хотите? У меня на странице пустой div : <div id="myCustomGrid"/> . И элемент $равен $(«#myCustomGrid»). Предоставленный исходный код просто создает кендоГрид внутри этого div.

5. Я проверил точный фрагмент кода в примере, и оказалось, что карта параметров называется — dojo.telerik.com/IqadArAn

Ответ №1:

Альтернативное решение состоит в том, чтобы:

  1. Пропустите настройку типа транспорта
  2. Реализовать пользовательский метод чтения

В этом вопросе описывается аналогичная проблема — https://www.telerik.com/forums/datasource-transport-function-mode-read-and-wrong-request-parameters.

Вот код пользовательского метода чтения, который должен быть размещен внутри DataSource.transport.

 read: (optionsData) => {
                            if (optionsData.data.filter) {
                                optionsData.data.filter.filters.forEach((item) => {
                                    if (item.field === "StartDate") {
                                        item.value = item.value.toISOString();
                                    }
                                });
                            }
                            var data = kendo.data.transports["aspnetmvc-ajax"].prototype.options.parameterMap.call({ options: { prefix: "" }}, optionsData.data, "read", false);
                            data.encryptedCollectionId = this.selectedCollection;
                            data.categoryUid = this.selectedCategory;

                            $.ajax({
                                type: "POST",
                                url: 'Pubs/GetPubs',
                                data: data
                            })
                            .then(
                                function succes(res) {
                                    optionsData.success(res);
                                },
                                function failure(res) {
                                    optionsData.error(res);
                                }
                            );
                        }