3

我有简单的 TurboTable,其中显示了一些数据,包括日期。

<p-table [value]="boxes" #dt>
    <ng-template pTemplate="header" let-columns>
        <tr>
            <th pSortableColumn="Number">
                Number
                <p-sortIcon field="Number"></p-sortIcon>
            </th>
            <th pSortableColumn="DateInserted">
                Interted at
                <p-sortIcon field="DateInserted"></p-sortIcon>
            </th>
        </tr>
        <tr>
            <th>
            <!-- Here is input to filter number -->
            </th>
            <th>
            <!-- Here I want to use Calendar component to select date range -->
            <p-calendar 
                [(ngModel)]="date"
                selectionMode="range"
                [readonlyInput]="true"
                dateFormat="dd.mm.yy"
                (onSelect)="onDateSelect($event)">
            </th>
        </tr>
    </ng-template>
    <ng-template pTemplate="body" let-box>
        <tr [pSelectableRow]="box">
            <td>{{box.Number}}</td>
            <td>{{box.DateInserted | date}}</td>
        </tr>
    </ng-template>
</p-table>

目前,Turbo Table 仅提供几种用于过滤器的匹配模式(“startsWith”、“contains”、“endsWith”、“equals”和“in”)。有没有按日期或日期范围过滤的选项?

我想使用日历组件来选择一个日期范围,然后按这些日期过滤数据。我正在使用 Date 对象(我在 Table with DatePipe 中显示它)。现在这些匹配模式都没有提供正确比较 Date 对象的选项。

解决方法是将日期存储为字符串,然后进行过滤。但这不是完美的解决方案,因为它会在将日期转换为字符串时产生问题,而且日期格式在任何地方都必须相同。那么也许有更好的选择来实现 TurboTable 中的日期范围过滤?

4

4 回答 4

11

组件.html

<p-calendar 
    [(ngModel)]="date"
    selectionMode="range"
    [readonlyInput]="true"
    dateFormat="dd.mm.yy"
    (onSelect)="dt.filter($event, 'DateInserted', 'myCustomFilter')">

组件.ts

PrimeNG 8.0.3 及更高版本

错误 TS2339:“表”类型上不存在属性“filterConstraints”

filterConstraints 在提交658507f中被替换为 FilterUtils。

import { Table } from 'primeng/table';
//angular 8 import { FilterUtils } from "primeng/api";
//angular 9 import { FilterUtils } from "primeng/utils";
import { FilterUtils } from "primeng/api";
...
@Component({...})
export MyComponent implements OnInit {
    @ViewChild('dt') private _table: Table;
    ngOnInit(){
        FilterUtils['myCustomFilter'] = (value, filter): boolean => {
            return value.getTime() == filter.getTime();
        }
    }
}

PrimeNG 8.0.2 及更低版本

import { Table } from 'primeng/table';
...
@Component({...})
export MyComponent implements OnInit {
    @ViewChild('dt') private _table: Table;
    ngOnInit(){
        this._table.filterConstraints['myCustomFilter'] = (value, filter): boolean => {
            return value.getTime() == filter.getTime();
        }
    }
}
于 2019-11-05T19:24:59.240 回答
9

作为一种解决方法,您可以暂时添加一个非常简单的自定义行为。

<p-calendar 
    [(ngModel)]="date"
    selectionMode="range"
    [readonlyInput]="true"
    dateFormat="dd.mm.yy"
    (onSelect)="dt.filter($event, 'DateInserted', 'my')">

然后,在您的组件中,您可以执行以下操作:

import Table from 'primeng/table';
...
@Component({...})
export MyComponent implements OnInit {
    @ViewChild('dt') private _table: Table;
    ngOnInit(){
        this._table.filterConstraints['my'] = (value, filter): boolean => {
            // Make sure the value and the filter are Dates
            return value.getTime() == filter.getTime();
        }
    }
}
于 2018-03-30T10:02:49.607 回答
7

从 PrimeNG 8.0.3 开始,primeng/table 组件上的 filterConstraints 属性似乎不再可用。我刚刚从 PrimeNG 6 升级到 8.0.3,现在看到以下内容:

错误 TS2339:“表”类型上不存在属性“filterConstraints”

在如下代码上:

    this.mydt.filterConstraints['dateRangeFilter'] = (value, filters): boolean => { ...

我知道 PrimeNG 8 现在支持日期过滤,但这是一个日期范围过滤器,我们也在其他地方进行了一些自定义过滤。是否删除了在 PrimeNG 表组件中实现自定义过滤功能的选项?

注意:我查看了 GitHub 上的最新更改,可以看到 filterConstraints 最近从 Table 组件中重构出来。我将 PrimeNG 降级到 8.0.2,现在一切正常。

于 2019-09-09T17:04:05.793 回答
6

更新:对于primeng 8.04版

我刚刚编写了一个自定义过滤器,使用@binary-alchemist 提供的答案以及搜索了几个小时后的其他一些答案。它工作,所以我分享代码:

import { FilterUtils } from 'primeng/components/utils/filterutils';
...
...
ngOnInit()
{
    FilterUtils['numberInBetween'] = (value: number, filter: [number, number]) =>
    {
        if (filter === undefined || filter === null)
        {
            return true;
        }

        if (value === undefined || value === null)
        {
            return false;
        }

        return value >= filter[0] && value <= filter[1];
    };
...
...
}
applyFilter(event , dt) {
    // id is the column name , start and end are two numbers , used for filtering id in between them
    dt.filter([start, end], 'id', 'numberInBetween');
}
于 2019-11-16T14:17:00.627 回答