Angular2 DataQuery ToDataString的KendoUI未在querystring中生成$filter

Angular2 DataQuery ToDataString的KendoUI未在querystring中生成$filter,angular,kendo-ui-angular2,Angular,Kendo Ui Angular2,Angular2的for KendoUI提到,toODataString方法将提供的状态对象转换为oData v4兼容的字符串 定义了所述状态对象的结构 我已经为Angular2网格设置了一个KendoUI,它具有数据绑定和服务器端分页功能,如前所述,运行良好 因此,现在我想向该状态添加一个过滤器对象,并使用以下代码执行此操作: private filter: CompositeFilterDescriptor; public applyFilters(): void { this.f

Angular2的for KendoUI提到,toODataString方法将提供的状态对象转换为oData v4兼容的字符串

定义了所述状态对象的结构

我已经为Angular2网格设置了一个KendoUI,它具有数据绑定和服务器端分页功能,如前所述,运行良好

因此,现在我想向该状态添加一个过滤器对象,并使用以下代码执行此操作:

private filter: CompositeFilterDescriptor;

public applyFilters(): void {
    this.filter = {
        logic: "and",
        filters: []
    };
    this.skip = 0;
    this.sort = [];

    if (this.customerNameFilter) {
        let fd: FilterDescriptor = {
            field: "name",
            operator: "contains",
            value: this.customerNameFilter,
            ignoreCase: true
        }
        this.filter.filters.push(fd);
    }
    this.service.query({ skip: this.skip, take: this.pageSize, filter: this.filter });
}
然后,service.query方法调用toODataString方法,并返回以下querystring(请注意双符号and,好像它试图插入计算结果为null的内容):

$skip=0&$top=15&&$count=true

下面是调试器的屏幕截图,显示了传递给toODataString方法的filterDescriptor实例的结构。请告诉我我做错了什么


结果表明,toODataString方法的当前beta版不支持它。我查看了它的源代码,发现没有处理传递给它的状态的filter属性

因此,我使用自己的filterSerializer附加到querystring:

private fetch(tableName: string, state: any, filter: CompositeFilterDescriptor): Observable<GridDataResult> {
    const queryStr = `${toODataString(state) + this.serializeFilter(filter)}&$count=true`;
    return this.http
        .get(`${this.BASE_URL}${tableName}?${queryStr}`)
        .map(response => response.json())
        .map(response => (<GridDataResult>{
            data: response.value,
            total: parseInt(response["@odata.count"], 10)
        }));
}

private serializeFilter(filter: CompositeFilterDescriptor): string {
    if (filter === null)
        return "";
    var filterString = "&$filter=";
    var filters = filter.filters.map(function (fd: FilterDescriptor) {
        switch (fd.operator) {
            case "contains":
                return "contains(" + fd.field + ", '" + fd.value + "')";
            case "eq":
                return fd.field + " eq '" + fd.value + "'";
        }            
    })
        .join(" " + filter.logic + " ");
    filterString += filters;
    return filterString;
}
private fetch(tableName:string,state:any,filter:CompositeFilterDescriptor):可观察{
const queryStr=`${toODataString(state)+this.serializeFilter(filter)}&$count=true`;
返回此文件。http
.get(`this.BASE\u URL}${tableName}?${queryStr}`)
.map(response=>response.json())
.map(响应=>({
数据:response.value,
总计:parseInt(响应[@odata.count],10)
}));
}
私有序列化筛选器(筛选器:CompositeFilterDescriptor):字符串{
如果(筛选器===null)
返回“”;
var filterString=“&$filter=”;
var filters=filter.filters.map(函数(fd:FilterDescriptor){
开关(fd.操作员){
案例“包含”:
return“contains”(“+fd.field+”,“+fd.value+”)”;
案例“eq”:
返回fd.field+“eq'”+fd.value+“'”;
}            
})
.join(“+filter.logic+”);
过滤器字符串+=过滤器;
返回过滤器串;
}