KendoUI для Angular2 DataQuery toODataString не создает фильтр $ в строке запроса

В документации для KendoUI для Angular2 упоминается, что Метод toODataString преобразует предоставленный объект состояния в строку, совместимую с oData v4.

Структура указанного объекта состояния определяется здесь .

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

Итак, теперь я хочу добавить объект фильтра в это состояние, и я использую для этого следующий код:

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 и возвращает следующую строку запроса (обратите внимание на двойной амперсанд, как если бы он пытался вставить что-то, что оценивается как null):

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

Вот снимок экрана отладчика, показывающий структуру экземпляра filterDescriptor, переданного в метод toODataString. Посоветуйте, пожалуйста, что я здесь делаю не так?

отладчик, показывающий объект FilterDescriptor


person Shawn de Wet    schedule 21.12.2016    source источник


Ответы (1)


Оказывается, он не поддерживается в текущей бета-версии метода toODataString. Я просмотрел его источник и обнаружил, что свойство фильтра состояния, которое передается ему, не обрабатывается.

Поэтому я свернул свой собственный filterSerializer, чтобы добавить его к строке запроса:

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;
}
person Shawn de Wet    schedule 21.12.2016