私は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>