2016-12-21 8 views
0

documentation Angular2のKendoUIは、toODataStringメソッドが、提供された状態オブジェクトをoData v4互換文字列に変換すると述べています。

前記状態オブジェクトの構造は、hereと定義されている。

hereのように、データバインディングとサーバー側のページングを使用して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メソッドを呼び出し、返されます以下のクエリ文字列(それがnullに評価され、何かを挿入しようとしたかのように二重のアンパサンドに注意してください):

$ = 0 $ &トップをスキップ= 15 & & $カウント=真

toODataStringメソッドに渡されたfilterDescriptorインスタンスの構造を示すデバッガーのスクリーンショットです。私がここで間違っていることをアドバイスしてください。

debugger showing FilterDescriptor object

答えて

1

それはtoODataString法の現在のベータ版ではサポートされていないが判明。私はそのソースを調べ、渡された状態のfilterプロパティの処理がないことがわかりました。

だから私は、クエリ文字列に追加する私自身の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; 
} 
関連する問題