2016-12-21 35 views
0

用於KendoUI for Angular2的documentation提到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方法,並返回下面的查詢字符串(注意雙符號,就好像它試圖插入一些評估爲null):

$跳過= 0 & $頂部= 15 & & $數=真

下面是調試器的屏幕截圖,顯示了傳遞給toODataString方法的filterDescriptor實例的結構。請告知我在這裏做錯了什麼?

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; 
}