2017-10-27 13 views
-1

私はODATAソースを持っています.1つの列はSQLから来るビットフィールド0/1です。これはブール型として機能します。その列のフィルタの種類を「ブール値」に設定すると、0/1ではなくtrue/falseの値が検索されるため、フィルタクエリは機能しません。私はそのフィルタクエリを置き換える(上書きする)必要があります。どうすればいい?ODATAバインドされた剣道グリッドの列フィルタを設定するにはどうしたらいいですか?

可能でない場合は、グリッドにパイプの存在が予想され、タイプの変換が可能になります。それはどこですか?

ただし、数値フィルタを使用している場合、ユーザーは0,1を入力する必要があり、誤って他の数値を入力する可能性があります。だから、それは実現可能ではありません。

カスタムのチェックボックステンプレートを挿入すると、そのセルの編集イベントがそのチェックボックスのクリックイベントによってトリガーされないため、機能していません。

答えて

0

私はTelerikからの回答から無駄に望みませんでした。

私はTelerik siteからコピーしたODATAサービスにアクセスするためにカスタムバインディングディレクティブを使用しています。これは、角型2の優れたアーキテクチャ構造のおかげです。

そこでは、フィルタのアクセスポイントを見つけることができます:

public rebind(): void { 
     this.products.query(this.state); 
    } 

状態引数がオブジェクトであるフィルタ特性を有し、かつこれは、フィルタ・ツリーのルートです。 (私のテーブルバインディングでは、フィルターの複雑なネストはなく、フィルターは単なる配列で、ユニークな列のフィルター項目は1つです) このstate.filterオブジェクトをイベントエミッターとハンドラーを介してパブリッシュして、コンポーネント、そしてハンドラーは、その非常に高い列のgilterに対して1/0にtrue/falseを返します。

import { Directive, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core'; 
    import { DataBindingDirective, GridComponent } from '@progress/kendo-angular-grid'; 
    import { ProjectAssignmentService } from './project-assignment-service'; 
    import { Subscription } from 'rxjs/Subscription'; 

    @Directive({ 
     selector: '[projectAssignmentBinding]' 
    }) 
    export class ProjectAssignmentBindingDirective extends DataBindingDirective implements OnInit, OnDestroy { 
     private serviceSubscription: Subscription; 

     constructor(private service: ProjectAssignmentService, grid: GridComponent) { 
      super(grid); 
     } 

     public ngOnInit(): void { 
      this.serviceSubscription = this.service.subscribe((result) => { 
       this.grid.data = result; 
      }); 

      super.ngOnInit(); 

      this.rebind(); 
     } 

     public ngOnDestroy(): void { 
      if (this.serviceSubscription) 
       this.serviceSubscription.unsubscribe(); 

      super.ngOnDestroy(); 
     } 

     @Output() setFilter: EventEmitter<any> = new EventEmitter(); 

     public rebind(): void { 
      // this.state.filter is undefined during initialization, 
      // which I consider to be a bug! 
      this.setFilter.emit(this.state.filter); 
      this.service.query(this.state); 
     } 
    } 

ハンドラは、コンポーネントのHTMLテンプレート内で宣言されています:

<kendo-grid projectAssignmentBinding ... (setFilter)="onSetFilter($event)" ... > 
    ... 
    </kendo-grid> 

およびコンポーネントでonSetFilterハンドラはその行います

public onSetFilter(filter: CompositeFilterDescriptor) : void 
    { 
     this.setBoolFilter(filter); 
    } 

    // Does only consider uncomposed FilterDescritors, which is given here. 
    private setBoolFilter(filter: CompositeFilterDescriptor): void { 
     if (filter == undefined || filter.filters == undefined) 
      return; 
     let allFilters = filter.filters as FilterDescriptor[]; 
     let droppedFilter = allFilters.filter((f) => f.field == "Dropped")[0]; 
     if (droppedFilter == null) 
      return; 
     // don't touch others' guts if not inevitably necessary: 
     if (droppedFilter.value === 1 || droppedFilter.value === 0) 
      return; 
     droppedFilter.value = droppedFilter.value ? 1 : 0; 
    } 

だから、ここに私のディレクティブです

ここで、「Dropped」は0/1ビットフィールドの列名であり、その列フィルタI剣道の列要素でブール値に設定されている

<kendo-grid-column field="Dropped" title="Dropped" editor="boolean" filter="boolean" (valueChange)="setBoolFilter(filter, $event)" [editable]="false" width="200px" > 
    <ng-template kendoGridCellTemplate let-dataItem> 
関連する問題