Kendo Grid Server повторно фильтрует источник данных

$(document).ready(function () {

    var agenciesData = new kendo.DataToken.DataSource({
        type: 'webapi',
        transport: {
            read: { url: "/api/Agencies/", dataType: "json", data: { activity: getActivity() } },
            create: { url: "/api/Agencies", type: "POST", dataType: "json" },
            destroy: { url: "/api/Agencies/{0}", type: "DELETE" },
            update: { url: "/api/Agencies/{0}", type: "PUT" },
            idField: "ID"
        },
        filter: [{ field: "Activity", operator: "eq", value: getActivity() }],
        pageSize: 15,
        page: 1,
        total: 0,
        serverPaging: true,
        serverSorting: true,
        serverFiltering: true,
        schema: {
            data: "Data",
            total: "Total",
            model: {
                id: "ID",
                fields: {
                    ID: { editable: false, type: "number" },
                    AgencyName: { type: "string" },
                    AgentName: { type: "string" },
                    Address: { type: "string" },
                    City: { type: "string" },
                    Tel1: { type: "string" },
                    Tel2: { type: "string" },
                    Pele: { type: "string" },
                    Activity: { type: "number" },
                    ToDate: { type: "date" }
                }
            }
        }
    });

    $("#agenciesGrid").kendoGrid({
        dataSource: agenciesData,
        toolbar: [{ text: "valid", className: "validAgents" }, { text: "not valid", className: "notValid" }, { text: "all", className: "allAgents" }, { text: "potential", className: "potetial" }],
        editable: false,
        navigatable: true,
        sortable: true,
        autoBind: false,
        height: 430,
        pageable: { refresh: true },
        columns: [
            { field: "ID", hidden: true },
            { field: "AgencyName", title: "agency", width: 150, filterable: { cell: { operator: "contains" } } },
            { field: "AgentName", title: "agent", width: 150, filterable: { cell: { operator: "contains" } } },
            { field: "Address", title: "address", width: 200, template: "#= Address + ' ' + City #", filterable: false },
            { field: "Tel1", title: "phones", width: 300, template: "#= Tel1 + ' : ' + Tel2 + ' : ' + Pele #", filterable: false },
            { field: "Activity", title: "active", width: "90px" },
            { field: "ToDate", title: "end Contract", type: "date", width: 90, format: "{0:dd/MM/yyyy}", parseFormats: ["yyyy-MM-ddThh:mm:ss"] }
        ]
    });


    $(".validAgents").click(function () { //valid
        $("#myActivity").val("1");
        $('#agenciesGrid').data().kendoGrid.dataSource.read({ activity: "1" });
    });

    $(".notValid").click(function () {//notValid
        $("#myActivity").val("2");
        $('#agenciesGrid').data().kendoGrid.dataSource.read({ activity: "2" });
    });

    $(".potetial").click(function () {//potetial
        $("#myActivity").val("3");
        $('#agenciesGrid').data().kendoGrid.dataSource.read({ activity: "3" });
    });
});


function getActivity(){
    var myActivity = $("#myActivity").val();
    return myActivity;
}

Когда я использую сетку кендо, уже отфильтрованную по параметру, например: $('#someGrid').data().kendoGrid.dataSource.read({ activity: value }); я вижу получение: https://localhost:44305/api/Agencies/?sort=&page=1&pageSize=15&group=&filter=&activity=1

Сетка фильтруется, как и ожидалось, но когда я хочу выполнить разбиение по страницам, сортировку, обновление - я получаю все данные, игнорируя фильтр, который я сделал. и я вижу получение: https://localhost:44305/api/Agencies/?sort=&page=1&pageSize=15&group=&filter=

Как я могу сохранить свое состояние фильтра, чтобы выполнить разбиение по страницам и сортировку данных, поступающих со стороны сервера? даже когда я использовал другой подход, такой как «прокручиваемый: { виртуальный: правда}», и когда я прокручиваю вниз - каждый запрос без фильтрации...

Спасибо


person AloniSoft    schedule 20.08.2015    source источник
comment
попробуйте использовать метод dataSource.filter(filter) вместо установки фильтра в .read(filter). Если {activity:value} не фильтр, а дополнительные данные для передачи на сервер, попробуйте поместить их в transport.read.data вместо этого   -  person user1102901    schedule 20.08.2015
comment
как я могу листать отфильтрованные данные, не уничтожая набор данных?   -  person AloniSoft    schedule 20.08.2015
comment
Вы имели в виду использование подкачки и сортировки на стороне клиента? Таким образом, он не будет снова обращаться к серверу, когда вы захотите выполнить разбиение по страницам и сортировку.   -  person user1102901    schedule 20.08.2015
comment
Я сделал фильтр: [{ field: Activity, operator: eq, value: 1 }] и теперь я вижу, что запросы на пейджинг выглядят так: localhost:44305/api/Agencies/. я думаю, что что-то пропустил, потому что я получаю 405 Method Not Allowed при загрузке данных, я вижу localhost:44305/api/Agencies/ должен ли я также использовать параметр фильтра чтения?   -  person AloniSoft    schedule 20.08.2015
comment
да, похоже, вы хотите, чтобы {activity:1} были дополнительными данными, отправляемыми на сервер, поэтому попробуйте параметр transport.read.data   -  person user1102901    schedule 20.08.2015
comment
хорошо, успех на первом шаге: теперь я запрашиваю это при загрузке данных в сетку: localhost:44305/api/Agencies/, но когда я выполняю подкачку, я вижу запрос: localhost:44305/api/Agencies/ почему активность изменилась до 2?   -  person AloniSoft    schedule 20.08.2015
comment
Что вы установили для transport.read.data?   -  person user1102901    schedule 20.08.2015
comment
читать: { URL-адрес: /api/Agencies/, тип данных: json, данные: {активность: getActivity() } }   -  person AloniSoft    schedule 20.08.2015
comment
Единственная причина, по которой я могу предположить, что активность изменилась на 2, заключается в том, что вы нажали .notValid. Каждый новый вызов сервера будет проверять значение активности. Вы щелкнули по нему?   -  person user1102901    schedule 20.08.2015
comment
на первом этапе я нажимаю на validAgents на панели сетки, чтобы получить активных агентов с сервера, а затем я перехожу на следующую страницу 2   -  person AloniSoft    schedule 20.08.2015
comment
Не уверен, что не так, попробуйте заменить данные функцией, например data:function(){return{ activity: getActivity() };}   -  person user1102901    schedule 20.08.2015
comment
я понимаю, что функция getActivity() вызывается один раз при загрузке сетки, а затем, когда я меняю значение активности, фильтр отправляет старый параметр, и это является причиной путаницы... Итак, как я могу это настроить ?   -  person AloniSoft    schedule 21.08.2015
comment
Вы пробовали то, что я сказал прямо над вами, придавая данным функцию?   -  person user1102901    schedule 21.08.2015
comment
Да, я это сделал, он срабатывает один раз при загрузке данных сетки, мне нужно что-то сделать, чтобы заставить источник данных выборки сетки получить новое значение в качестве данных фильтра. например, когда я нажимаю на действительный - я могу листать страницы и сортировать, и все в порядке. но когда я нажимаю «недействительно», я хочу, чтобы сетка получала новое значение данных, которое не является огнем   -  person AloniSoft    schedule 21.08.2015
comment
когда я нажимаю Valid, получаю: /api/Agencies/?0=1&sort=&page=1&pageSize=15&group=&filter=activity~eq~%271%27&activity=1 И когда я нажимаю Not Valid, получаю: /api/Agencies/ ?0=1&sort=&page=4&pageSize=15&group=&filter=activity~eq~%271%27&activity=2   -  person AloniSoft    schedule 21.08.2015
comment
the: filter=activity~eq~%271%27 всегда остается одним и тем же значением...   -  person AloniSoft    schedule 21.08.2015
comment
Итак, насколько я понимаю, значение activity=value работает, но фильтр не обновляется должным образом. Попробуйте также сделать фильтр функцией? filter: function(){return [{ field: "Activity", operator: "eq", value: getActivity() }];}   -  person user1102901    schedule 21.08.2015
comment
Не могли бы вы сделать codepen.io, чтобы я мог с ним возиться.   -  person user1102901    schedule 21.08.2015


Ответы (1)


Ты пробовал

var agenciesData = new kendo.DataToken.DataSource({
  filter : function () {
     return object;
  }
});

Я имею в виду, попробуйте использовать фильтр как функцию, и вы можете выполнять свою логику внутри функции в зависимости от ситуации.

person M Munir    schedule 22.08.2015
comment
теперь с вашим советом - я сделал это: filter: function() { var ds = $(#agenciesGrid).data(kendoGrid).dataSource; ds.filter([{ фильтры: [{поле: Activity, оператор: eq, значение: getActivity() }] }]); } и ссылка на запрос выглядит так: /api/Agencies/?sort=&page=1&pageSize=15&group=&filter=&activity=1, которая вообще не является фильтром - person AloniSoft; 22.08.2015
comment
мне нужно (на сервере) отменить параметр активности? - person AloniSoft; 22.08.2015
comment
с этим фильтром низкая производительность, потому что на сервере получают из всего списка и возвращают фильтр... - person AloniSoft; 25.08.2015