2016-12-21 7 views
0

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

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

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

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

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

$ = 0 пропустить & $ топ = 15 & & $ кол = верно

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

debugger showing FilterDescriptor object

ответ

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; 
} 
Смежные вопросы