0

kendoDatasource に次の requestStart があります。

 requestStart: function (e) {
            var oldFilters = e.sender._filter ? e.sender._filter.filters : [],
                endDateTime;

            $.each(oldFilters, function (index, currFilter) {
                if (currFilter.field === 'StatusChangeDate' && currFilter.operator == 'eq') {
                    endDateTime = new Date(currFilter.value.getYear(), currFilter.value.getMonth(), currFilter.value.getDay(), 23, 59, 59);

                    oldFilters.push({ field: currFilter.field, operator: 'gt', value: currFilter.value });
                    oldFilters.push({ field: currFilter.field, operator: 'lt', value: endDateTime });
                    oldFilters.splice(index, 1);
                }
            });

            if (e.sender._filter) {
                e.sender._filter.filters = oldFilters;
            }
        },

フィルターの精度を無効にするために、演算子が「eq」の場合に DateTime フィルターを変更したいと考えています。しかし、上記のコードのように requestStart でフィルターを変更すると、機能しません。リクエストは古いフィルターで送信されます。何が間違っているのかわかりません。このような動作を実現する別の方法はありますか?

4

1 に答える 1

0

requestStart が呼び出されるまでに、クエリはすでにそのまま送信されるようにコミットされています。イベントはあなたに知らせるだけで、何かを変える機会をあなたに与えるわけではありません。

逆の方法で忍び込もうとするのではなく、dataSource の filter() メソッドを呼び出して、任意の方法でフィルタリングします。DataSource は、serverFiltering オプションの値に応じて、ローカルでデータをフィルタリングするか、サーバーに要求を行います。

var filters = myDataSource.filter() || [],
    endDateTime;

$.each(filters, function (index, currFilter) {
    if (currFilter.field === 'StatusChangeDate' && currFilter.operator == 'eq') {
        endDateTime = new Date(currFilter.value.getYear(), currFilter.value.getMonth(), currFilter.value.getDay(), 23, 59, 59);

        filters.push({ field: currFilter.field, operator: 'gt', value: currFilter.value });
        filters.push({ field: currFilter.field, operator: 'lt', value: endDateTime });
        filters.splice(index, 1);
    }
});

// Now apply the new filter to the dataSource.  
// This will generate a request if serverFiltering == true.
myDataSource.filter(filters);

もう 1 つの注意点として、「e.sender._filter」のように「_」で始まるプロパティにはアクセスしないようにしてください。これは通常、次のバージョンで変更される可能性のある「プライベート」プロパティと見なされます。上記のコードのように、引数を指定せずに filter() を呼び出すと、現在のフィルターを取得できます。これは剣道のもう 1 つの一般的なルールです。引数なしは値を取得することを意味し、引数は値を設定することを意味します。

編集

また、CRUD リクエストをハイジャックして、dataSource のtransport.parameterMapプロパティを使用してパラメーターを変更および/または追加することもできます。このメソッドは、dataSource のフィルタ プロパティを変更しないことに注意してください。サーバーに送られるリクエストパラメータのみを変更します。

$("#myGrid").kendoGrid({

    // Column definitions, etc...

    dataSource = new kendo.data.DataSource({
        transport: {

            // create, read, update, destroy definitions...

            parameterMap: function(data, type) {
                if ((type === "read") && data.filter && data.filter.filters) {
                    var filters = data.filter.filters;
                    for (var index = 0; index < filters.length, index++) {
                        var currFilter = filters[index];
                        if (currFilter.field === 'StatusChangeDate' && currFilter.operator == 'eq') {
                            endDateTime = new Date(currFilter.value.getYear(), currFilter.value.getMonth(), currFilter.value.getDay(), 23, 59, 59);
                            filters.push({ field: currFilter.field, operator: 'gt', value: currFilter.value });
                            filters.push({ field: currFilter.field, operator: 'lt', value: endDateTime });
                            filters.splice(index, 1);
                            break;
                        }
                    });
                }

                return data;    
            }
        }
    }),
});
于 2014-10-17T09:42:17.343 に答える