除了默认字段值之外,按特定列对角度ui网格进行排序

时间:2016-06-14 07:12:15

标签: angularjs sorting typescript angular-ui-grid ui-grid

我有一张名为Job的表:

name    nvarchar(50)
id  int
description nvarchar(50)
enabled bit
date_modified   datetime
user    nvarchar(50)

具体课程:

public class Job {
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public bool Enabled { get; set; }
    public DateTime DateModified { get; set; }
    public string User { get; set; }
}

我在我的应用程序上使用angular和typescript,我在尝试显示数据时遇到以下问题:

我使用角度类型网格的ui网格,我有以下列defs:

    columnDefs: [
        {
            field: 'id',
            defaultFilter: FilterOperator.EQU,
            sort: {

                direction: this.uiGridConstants.DESC,
                priority: 0,
            },
            type: 'number'
        },
        { field: 'name', defaultFilter: FilterOperator.LIKE, sort: null },
        { field: 'description', defaultFilter: FilterOperator.LIKE, sort: null },
        { field: 'enabled', filter: { type: 'select', selectOptions: [{ value: true, label: 'True' }, { value: false, label: 'False' }] } },
        { field: 'user', defaultFilter: FilterOperator.LIKE, sort: null },
        { field: 'date_modified', type: 'date', enableFiltering: false, sort: null, cellTemplate: '<div>{{row.entity.dateModified | date:\'dd/MM/yyyy hh:mm:ss\'}}</div>' },
        { field: 'action', enableFiltering: false, enableSorting: false, sort: null, cellTemplate: `${this.baseUrl}app/automaticAction/listActionsTemplate.html` }
    ]

我的问题是,为了对日期修改列进行排序,我需要将字段属性值作为数据库列(date_modified),但为了显示数据,我需要使用类属性(dateModified)。有没有办法扩展列defs或东西来指定我想要排序的列? 我目前正在使用celltemplate的解决方法,但我不喜欢它。

1 个答案:

答案 0 :(得分:1)

是的,您可以在columnDef ...

中指定sortingAlgorithm属性
{ field: 'DateModified', type: 'date', enableFiltering: false, sort: null, cellTemplate: '<div>{{row.entity.DateModified | date:\'dd/MM/yyyy hh:mm:ss\'}}</div>', sortingAlgorithm: SomeCommonServiceOfYours.getDateSortingAlgorithm() },

然后在服务(或您的范围)中指定算法,如此

getDateSortingAlgorithm: function () {
    return function (aDate, bDate) {
        var dateDisplayFormat = 'dd/MM/yyyy hh:mm:ss';
        var aMoment = moment(aDate, dateDisplayFormat);
        var bMoment = moment(bDate, dateDisplayFormat);
        if (aMoment.isBefore(bMoment)) {
            return -1;
        } else if (bMoment.isBefore(aMoment)) {
            return 1;
        } else {
            return 0;
        }
     }
},

这假设您正在使用时刻,一个非常好的包用于所有日期和时间处理,但如果没有,您可以根据需要调整该算法。