如何按集合的嵌套 属性 对过滤器选项进行分组。单个复选框
How to group filter options by nested property of a collection. Single checkbox
我想知道如何按集合的 属性 字段对列的筛选值进行分组。
列数据:
{
users: [
{id: 1, isExternal: true, name: "John" },
{id: 2, isExternal: false, name: "George"},
{id: 3, isExternal: true, name: "Bob"}
]
}
外部用户通过 valueGetter 函数格式化:
columnDefs: [
{
enableRowGroup: true,
field: "users",
headerName: "Users",
minWidth: 150,
filter: "agSetColumnFilter",
valueGetter: (params: any) => {
return (params.data.users || []).map((user: User) =>
user.isExternal ? `${user.name} (EXT)` : user.name
);
}
}
];
我最终得到了带有每个值的许多复选框的列过滤器。
是否可以将筛选项分组到 1 个复选框中?
例如:一个名为“外部”的复选框过滤器,它将在所有外部用户中进行过滤,当未选中时,它将显示所有用户。
您可以构建自定义过滤器来实现这一点。
根据此文档,您需要构建两个组件:
- 实际的过滤器组件,检查列数据是否具有正确的值
- 一个“浮动过滤器”,如果你想使用这个过滤器
列header后面
浮动过滤器调用“主”过滤器中的逻辑并更新 table 中的视图。
对于主过滤器,代码可以是这样的:
@Component( selector: 'app-boolean-filter',
template: '
<div class="ag-filter">
<select [(value)]="currentFilterValue" (change)="filterChange($event.target.value)">
<option value="">all values</option>
<option value="true">yes</option>
<option value="false">no</option>
</select>
</div>',
style: '.ag-filter {
width: 100%;
select {
width: 100%;
min-height: 24px;
border-radius: 3px;
padding-left: 6px;
border-width: 1px;
border-style: solid;
border-color: #babfc7;
}
}')
export class BooleanFilterComponent implements IFilterAngularComp {
currentFilterValue: any;
private params: IFilterParams;
private valueGetter: (rowNode: RowNode) => any;
agInit(params: IFilterParams): void {
this.params = params;
this.currentFilterValue = null;
this.valueGetter = params.valueGetter;
}
isFilterActive(): boolean {
return this.currentFilterValue !== null;
}
doesFilterPass(params: IDoesFilterPassParams): boolean {
const valueGetter: any = this.valueGetter;
const value: any = valueGetter(params);
if (this.isFilterActive()) {
return value === JSON.parse(this.currentFilterValue);
}
}
getModel(): any {
return this.isFilterActive() ? this.currentFilterValue : null;
}
setModel(model: any): void {
this.filterChange(model);
}
afterGuiAttached(params: IAfterGuiAttachedParams): void {
}
takeValueFromFloatingFilter(value: any): void {
this.filterChange(value);
}
filterChange(newValue: any): void {
this.currentFilterValue = newValue === '' ? null : newValue;
this.params.filterChangedCallback();
}
}
doesFilterPass 方法是魔法发生的地方:valueGetter(params),从您配置的数据字段中获取值在网格列中并检查它是否通过过滤器,在 table.
中隐藏或显示它
我想知道如何按集合的 属性 字段对列的筛选值进行分组。
列数据:
{
users: [
{id: 1, isExternal: true, name: "John" },
{id: 2, isExternal: false, name: "George"},
{id: 3, isExternal: true, name: "Bob"}
]
}
外部用户通过 valueGetter 函数格式化:
columnDefs: [
{
enableRowGroup: true,
field: "users",
headerName: "Users",
minWidth: 150,
filter: "agSetColumnFilter",
valueGetter: (params: any) => {
return (params.data.users || []).map((user: User) =>
user.isExternal ? `${user.name} (EXT)` : user.name
);
}
}
];
我最终得到了带有每个值的许多复选框的列过滤器。
是否可以将筛选项分组到 1 个复选框中?
例如:一个名为“外部”的复选框过滤器,它将在所有外部用户中进行过滤,当未选中时,它将显示所有用户。
您可以构建自定义过滤器来实现这一点。
根据此文档,您需要构建两个组件:
- 实际的过滤器组件,检查列数据是否具有正确的值
- 一个“浮动过滤器”,如果你想使用这个过滤器 列header后面
浮动过滤器调用“主”过滤器中的逻辑并更新 table 中的视图。
对于主过滤器,代码可以是这样的:
@Component( selector: 'app-boolean-filter',
template: '
<div class="ag-filter">
<select [(value)]="currentFilterValue" (change)="filterChange($event.target.value)">
<option value="">all values</option>
<option value="true">yes</option>
<option value="false">no</option>
</select>
</div>',
style: '.ag-filter {
width: 100%;
select {
width: 100%;
min-height: 24px;
border-radius: 3px;
padding-left: 6px;
border-width: 1px;
border-style: solid;
border-color: #babfc7;
}
}')
export class BooleanFilterComponent implements IFilterAngularComp {
currentFilterValue: any;
private params: IFilterParams;
private valueGetter: (rowNode: RowNode) => any;
agInit(params: IFilterParams): void {
this.params = params;
this.currentFilterValue = null;
this.valueGetter = params.valueGetter;
}
isFilterActive(): boolean {
return this.currentFilterValue !== null;
}
doesFilterPass(params: IDoesFilterPassParams): boolean {
const valueGetter: any = this.valueGetter;
const value: any = valueGetter(params);
if (this.isFilterActive()) {
return value === JSON.parse(this.currentFilterValue);
}
}
getModel(): any {
return this.isFilterActive() ? this.currentFilterValue : null;
}
setModel(model: any): void {
this.filterChange(model);
}
afterGuiAttached(params: IAfterGuiAttachedParams): void {
}
takeValueFromFloatingFilter(value: any): void {
this.filterChange(value);
}
filterChange(newValue: any): void {
this.currentFilterValue = newValue === '' ? null : newValue;
this.params.filterChangedCallback();
}
}
doesFilterPass 方法是魔法发生的地方:valueGetter(params),从您配置的数据字段中获取值在网格列中并检查它是否通过过滤器,在 table.
中隐藏或显示它