Kendo ui toODataString方法引发错误筛选器运算符(…)不是函数

Kendo ui toODataString方法引发错误筛选器运算符(…)不是函数,kendo-ui,odata,kendo-ui-angular2,Kendo Ui,Odata,Kendo Ui Angular2,我正在使用剑道UI的过滤器小部件来进行分析。为了将过滤器表达式转换为oData查询,我使用toODataQuery方法并将状态传递给它 在添加组时,我得到 filterOperators(...) is not a function at odata-filtering.operators.js:69 at funcs.js:4 at odata-filtering.operators.js:70 at Array.map (<anonymous>)

我正在使用剑道UI的过滤器小部件来进行分析。为了将过滤器表达式转换为oData查询,我使用toODataQuery方法并将状态传递给它

在添加组时,我得到

 filterOperators(...) is not a function
    at odata-filtering.operators.js:69
    at funcs.js:4
    at odata-filtering.operators.js:70
    at Array.map (<anonymous>)
filterOperators(…)不是函数
在odatafiltering.operators.js:69
在funcs.js:4
在odatafiltering.operators.js:70
at Array.map(

我能够重现错误,但错误是不同的。 我做错了什么

app.component.ts:

import { Component, OnInit, ElementRef, ViewChild, Output, Input, EventEmitter } from '@angular/core';
import { CompositeFilterDescriptor, FilterDescriptor, State, toODataString, normalizeFilters } from '@progress/kendo-data-query';

declare var kendo: any;

@Component({
    selector: 'my-app',
    template: `
        <div #positionFilter></div>
    `
})
export class AppComponent implements OnInit {
    @ViewChild('positionFilter',{static: true}) positionFilter: ElementRef;
    public filterExpression: CompositeFilterDescriptor;
 public state: State = {
    skip: 0,
    take: 5,
    // Initial filter descriptor
    filter: null
  };

   ngOnInit() {
         this.loadFilter(this.positionFilter.nativeElement,  this.filterExpression);

   }

   public loadFilter(filterContainer,  expressionVal) {
    kendo.jQuery(filterContainer).kendoFilter({
      dataSource: [],
      //applyButton: false,
      expressionPreview: true,
      expression: expressionVal,
      change: this.onChangeFieldDropDownEvent.bind(this),
      fields: [
          { name: "ProductName",type: "string", label: "String" },
          { name: "CategoryID", type: "number", label: "Number"},
          { name: "UnitPrice", type: "boolean", label: "boolean"},
          { name: "UnitsInStock", type: "date", label: "Date" }
      ]
    });
  }



  onChangeFieldDropDownEvent(e) {
    console.log('Filter Expression--', e.expression);
    this.addSearch();
    this.filterExpression = e.expression;//.filters;
    this.updateState(this.filterExpression);
    let serializedFilterValue = this.serializeFilter(this.state);
    console.log('serializedFilterValue----', serializedFilterValue)

  }

  public updateState(filter) {
    this.state.filter = filter;
  }
  private serializeFilter(state: State): string {
    return toODataString(state);
  }

   public addSearch() {
    let container = this.positionFilter.nativeElement;
    kendo.jQuery(container).find(".k-filter-field select.k-filter-dropdown").each(function (i, x) {
      kendo.jQuery(x).data("kendoDropDownList").setOptions({ filter: "contains" });
    });
  }
}
import{Component,OnInit,ElementRef,ViewChild,Output,Input,EventEmitter}来自“@angular/core”;
从“@progress/kendo data query”导入{CompositeFilterDescriptor,FilterDescriptor,State,toODataString,normalizeFilters};
宣布var kendo:任何;
@组成部分({
选择器:“我的应用程序”,
模板:`
`
})
导出类AppComponent实现OnInit{
@ViewChild('positionFilter',{static:true})positionFilter:ElementRef;
公共筛选器表达式:CompositeFilterDescriptor;
公共状态:状态={
跳过:0,
拍摄:5,
//初始过滤器描述符
筛选器:空
};
恩戈尼尼特(){
this.loadFilter(this.positionFilter.nativeElement,this.filterExpression);
}
公共加载筛选器(filterContainer,expressionVal){
jQuery(filterContainer).kendoFilter({
数据源:[],
//applyButton:false,
expressionPreview:对,
表达式:expressionVal,
更改:this.onChangeFieldDropDownEvent.bind(this),
字段:[
{名称:“产品名称”,类型:“字符串”,标签:“字符串”},
{name:“CategoryID”,type:“number”,label:“number”},
{名称:“单价”,类型:“布尔”,标签:“布尔”},
{名称:“UnitsInStock”,类型:“日期”,标签:“日期”}
]
});
}
onChangeFieldDropDownEvent(e){
log('Filter Expression--',e.Expression);
这个.addSearch();
this.filtereexpression=e.expression;//.filters;
this.updateEstate(this.filterExpression);
让serializedFilterValue=this.serializeFilter(this.state);
log('serializedFilterValue-->',serializedFilterValue)
}
公共屋(过滤器){
this.state.filter=过滤器;
}
私有序列化筛选器(状态:状态):字符串{
返回数据字符串(状态);
}
公共addSearch(){
让容器=this.positionFilter.nativeElement;
jQuery(容器).find(“.k-filter-field select.k-filter-dropdown”)。每个(函数(i,x){
jQuery(x).data(“kendoDropDownList”).setOptions({filter:“contains”});
});
}
}

我已经向剑道团队提出了这个问题

这是他们的建议:

出现此问题的原因是toODataString无法序列化空筛选器对象。可能的解决方案是在序列化参数之前删除所有空筛选器。 e、 g


toODataQuery
不支持分组,OData v4的剑道网格也不支持分组;我之前已经检查过Telerik支持。
  private serializeFilter(state: State): string {
    removeEmptyFilters(state.filter)
    return toODataString(state);
  }

  function removeEmptyFilters(expression){
    var that = this;
            if (expression.filters) {
            expression.filters =  kendo.jQuery.grep(expression.filters, function(filter) {
                removeEmptyFilters(filter);
                if (filter.filters) {
                    return filter.filters.length;
                } else {
                    return filter.value;
                }
            });
        }
  }