如何在角度 ui-grid 中捕获应用的列过滤器 [英] How to catch applied column filter in angular ui-grid

查看:33
本文介绍了如何在角度 ui-grid 中捕获应用的列过滤器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 ui-grid 和服务器端过滤.对于每一列,我根据过滤器值向带有参数的 API 发送请求.默认参数为空

 var filterOptions = {filterBy: '&$filter=',过滤参数:"};//和 api 调用看起来像?$orderby=id-&pageSize=250&pageNbr=1&$filter=

如果我设置了任何过滤器,我就会发送下一个请求

param: filterOptions.filterParam = 'eventTypeId==' + evtTypeId请求:?$orderby=id-&pageSize=250&pageNbr=1&$filter=eventTypeId==2

所以我想要的是非常简单的想法,我想检查是否已经应用过滤器并发送像

这样的请求

?$orderby=id-&pageSize=250&pageNbr=1&$filter=eventTypeId==2,studyId==1

但不幸的是我无法捕获任何应用的过滤器.如果有人可以帮助解决我的问题,我将不胜感激.

我的代码如下

列定义

 $scope.gridOptions.columnDefs = [{字段:'标题',细胞类:getCellClass,useExternalFiltering: 真}, {字段:'说明',细胞类:getCellClass,启用过滤:真,useExternalFiltering: 真}, {显示名称:'类型',字段:'eventType.name',筛选: {选择选项:$scope.eventType,类型:uiGridConstants.filter.SELECT},细胞类:getCellClass,useExternalFiltering: 真}, {displayName: '研究名称',字段:'study.name',筛选: {选择选项:$scope.study,类型:uiGridConstants.filter.SELECT},细胞类:getCellClass,useExternalFiltering: 真}, {displayName: '优先级',字段:'priority.name',筛选: {选择选项:$scope.priority,类型:uiGridConstants.filter.SELECT},细胞类:getCellClass,useExternalFiltering: 真}, {displayName: '严重性',字段:'severity.name',筛选: {选择选项:$scope.severity,类型:uiGridConstants.filter.SELECT},细胞类:getCellClass,useExternalFiltering: 真}, {displayName: '状态',字段:'status.name',筛选: {选择选项:$scope.status,类型:uiGridConstants.filter.SELECT},细胞类:getCellClass,useExternalFiltering: 真}, {displayName: '创建',字段:'occuredDate',宽度: '12%',filterHeaderTemplate: '<div class="row ui-grid-filter-container">'+'<div ng-repeat="col.filters 中的 colFilter" class="col-md-6 col-sm-6 col-xs-6">'+'

',过滤器: [{name: '来自',条件:uiGridConstants.filter.GREATER_THAN_OR_EQUAL},{name: '到',条件:uiGridConstants.filter.LESS_THAN_OR_EQUAL}],cellFilter: 'date:"dd MMMM yyyy, h:mm:ss a"',细胞类:getCellClass,使用外部过滤:假}, {显示名称:'修改',字段:'createdDate',宽度: '12%',filterHeaderTemplate: '<div class="row ui-grid-filter-container">'+'<div ng-repeat="col.filters 中的 colFilter" class="col-md-6 col-sm-6 col-xs-6">'+'

',过滤器: [{name: '来自',条件:uiGridConstants.filter.GREATER_THAN_OR_EQUAL},{name: '到',条件:uiGridConstants.filter.LESS_THAN_OR_EQUAL}],cellFilter: 'date:"dd MMMM yyyy, h:mm:ss a"',细胞类:getCellClass,使用外部过滤:假}];

注册API

 $scope.gridOptions.onRegisterApi = function (gridApi) {$scope.gridApi = gridApi;gridApi.selection.selectRow($scope.gridOptions.data[0]);gridApi.pagination.on.paginationChanged($scope, function (newPage, pageSize) {paginationOptions.pageNbr = '&pageNbr=' + newPage ;paginationOptions.pageSize = '&pageSize=' + pageSize;获取数据();});gridApi.core.on.filterChanged( $scope, function() {var grid = this.grid;//定义取消过滤的行为$scope.isfilterclear = true;angular.forEach(grid.columns, function( col ) {if(col.filters[0].term){$scope.isfilterclear = false;}});如果($scope.isfilterclear){$超时(功能(){$rootScope.refresh()},500);}//过滤行为$scope.textFilter = grid.columns[1].filters[0].term;如果($scope.textFilter){$scope.$watch('textFilter', function (newVal, oldVal) {filterOptions.filterParam = 'title==*' + newVal + "*";}, 真的);获取数据()}$scope.desFilter = grid.columns[2].filters[0].term;如果($scope.desFilter){$scope.$watch('desFilter', function (newVal, oldVal) {filterOptions.filterParam = 'description==*' + newVal + "*";}, 真的);获取数据()}for (var et = 0; et < $scope.eventType.length; et ++){var evtType = $scope.eventType[et].name;var evtTypeId = $scope.eventType[et].id;filterOptions.filterParam = 'eventTypeId==' + evtTypeId;if( grid.columns[3].filters[0].term === evtType ) {获取数据()}}对于(var 螺柱 = 0;螺柱 <$scope.study.length;螺柱 ++){var study = $scope.study[stud].name;var studyId = $scope.study[stud].id;filterOptions.filterParam = 'studyId==' + studyId;if( grid.columns[4].filters[0].term === 学习 ) {获取数据()}}for (var pr = 0; pr < $scope.priority.length; pr ++){var 优先级 = $scope.priority[pr].name;var priorityId = $scope.priority[pr].id;filterOptions.filterParam = 'priorityId==' + priorityId;if( grid.columns[5].filters[0].term === 优先级) {获取数据()}}for (var sev = 0; sev < $scope.severity.length; sev ++){var 严重性 = $scope.severity[sev].name;varseverityId = $scope.severity[sev].id;filterOptions.filterParam = 'severityId==' + SeverityId;if( grid.columns[6].filters[0].term === 严重性 ) {获取数据()}}for (var stat = 0; stat < $scope.status.length; stat ++){var status = $scope.status[stat].name;var statusId = $scope.status[stat].id;filterOptions.filterParam = 'statusId==' + statusId;if( grid.columns[7].filters[0].term === status ) {获取数据()}}});

getData() 在哪里

var getData = function () {eventService.getEventsWithParams(sortOptions.orderBy,sortOptions.directions,paginationOptions.pageSize,paginationOptions.pageNbr,filterOptions.filterBy,filterOptions.filterParam).then(函数(数据){$scope.gridOptions.data = 数据;//***angular.forEach($scope.gridOptions.data, 函数 (val) {val.occuredDate = 新日期(val.occuredDate);});//$interval 等待网格消化我们刚刚给它的数据$间隔(函数(){$scope.gridApi.selection.selectRow($scope.gridOptions.data[0]);}, 0, 1);});};

我的 plunker(遗憾的是我无法提供真正的 API,但希望它无论如何都会有所帮助)

解决方案

工作代码为

 gridApi.core.on.filterChanged( $scope, function() {//声明变量var grid = this.grid;var 列 = grid.columns;$scope.columnTitle = grid.columns[1].filters[0].term;$scope.columnDesc = grid.columns[2].filters[0].term;var columnType = grid.columns[3].filters[0].term;var columnStudy = grid.columns[4].filters[0].term;var columnPriority = grid.columns[5].filters[0].term;var columnSeverity = grid.columns[6].filters[0].term;var columnStatus = grid.columns[7].filters[0].term;var columnCreatedDate = grid.columns[8].filters[0].term;var columnModifiedDate = grid.columns[9].filters[0].term;//创建可选过滤器的请求var 查询 = [];无功字符串;函数请求(id,参数){if(param === "title==" || param === "描述=="){query.push(param + "*" + id + "*")} 别的 {query.push(param + id);}if (query.length <= 1){返回查询} 别的 {string = query.join(";");返回字符串;}}//定义取消过滤的行为$scope.isfilterclear = true;angular.forEach(列,函数(col){if(col.filters[0].term){$scope.isfilterclear = false;}});如果($scope.isfilterclear){$超时(功能(){$rootScope.refresh()},500);}//列的过滤行为如果($scope.columnTitle){$scope.$watch('columnTitle', function (newVal, oldVal) {filterOptions.filterParam = request(newVal, 'title==*');}, 真的);获取数据()}如果($scope.columnDesc){$scope.$watch('columnDesc', function (newVal, oldVal) {filterOptions.filterParam = request(newVal, 'description ==');}, 真的);获取数据()}如果(列类型){filterOptions.filterParam = request(columnType, 'eventTypeId==');获取数据();}如果(列研究){filterOptions.filterParam = request(columnStudy, 'studyId==');获取数据();}如果(列优先级){filterOptions.filterParam = request(columnPriority, 'priorityId==');获取数据();}如果(列严重性){filterOptions.filterParam = request(columnSeverity, 'severityId==');获取数据();}如果(列状态){filterOptions.filterParam = request(columnStatus, 'statusId==');获取数据();}如果(列创建日期){filterOptions.filterParam = request($rootScope.setFilterDate, 'occuredDate>=');获取数据()}如果(列修改日期){filterOptions.filterParam = request($rootScope.setFilterDate, 'occuredDate>=');获取数据()}});

如您所见,我声明了带有两个参数的自定义函数,我在其中为每次调用提供了我的请求参数,我不确定这种方式是否优雅,但两周来我没有找到更好的解决方案

I'm working with ui-grid and server-side filtering. For each column I send a request to API with param based on filter value. By default param is empty

     var filterOptions = {
                filterBy: '&$filter=',
                filterParam: ""
            };

  // and api call looks like

?$orderby=id-&pageSize=250&pageNbr=1&$filter=

if I setup any filter I send next request

param:     filterOptions.filterParam = 'eventTypeId==' + evtTypeId

request:   ?$orderby=id-&pageSize=250&pageNbr=1&$filter=eventTypeId==2

So what I want is pretty simple idea, I want to check if filter is already applied and send a request like

?$orderby=id-&pageSize=250&pageNbr=1&$filter=eventTypeId==2,studyId==1

but unfortunately I cannot catch any applied filters. I appreciate if somebody could help with my issue.

My code below

columnDef

 $scope.gridOptions.columnDefs = [
                {
                    field: 'title',
                    cellClass: getCellClass,
                    useExternalFiltering: true
                }, {
                    field: 'description',
                    cellClass: getCellClass,
                    enableFiltering: true,
                    useExternalFiltering: true
                }, {
                    displayName: 'Type',
                    field: 'eventType.name',
                    filter: {
                        selectOptions: $scope.eventType,
                        type: uiGridConstants.filter.SELECT

                    },
                    cellClass: getCellClass,
                    useExternalFiltering: true
                }, {
                    displayName: 'Study Name',
                    field: 'study.name',
                    filter: {
                        selectOptions: $scope.study,
                        type: uiGridConstants.filter.SELECT
                    },
                    cellClass: getCellClass,
                    useExternalFiltering: true
                }, {
                    displayName: 'Priority',
                    field: 'priority.name',
                    filter: {
                        selectOptions: $scope.priority,
                        type: uiGridConstants.filter.SELECT
                    },
                    cellClass: getCellClass,
                    useExternalFiltering: true
                }, {
                    displayName: 'Severity',
                    field: 'severity.name',
                    filter: {
                        selectOptions: $scope.severity,
                        type: uiGridConstants.filter.SELECT
                    },
                    cellClass: getCellClass,
                    useExternalFiltering: true
                }, {
                    displayName: 'Status',
                    field: 'status.name',
                    filter: {
                        selectOptions: $scope.status,
                        type: uiGridConstants.filter.SELECT
                    },
                    cellClass: getCellClass,
                    useExternalFiltering: true
                }, {
                    displayName: 'Created',
                    field: 'occuredDate',
                    width: '12%',
                    filterHeaderTemplate: '<div class="row ui-grid-filter-container">' +
                    '<div ng-repeat="colFilter in col.filters" class="col-md-6 col-sm-6 col-xs-6">' +
                    '<div custom-grid-date-filter-header></div></div></div>',
                    filters: [
                        {
                            name: 'From',
                            condition: uiGridConstants.filter.GREATER_THAN_OR_EQUAL
                        },
                        {
                            name: 'To',
                            condition: uiGridConstants.filter.LESS_THAN_OR_EQUAL
                        }
                    ],
                    cellFilter: 'date:"dd MMMM yyyy, h:mm:ss a"',
                    cellClass: getCellClass,
                    useExternalFiltering: false
                }, {
                    displayName: 'Modified', field: 'createdDate',
                    width: '12%',
                    filterHeaderTemplate: '<div class="row ui-grid-filter-container">' +
                    '<div ng-repeat="colFilter in col.filters" class="col-md-6 col-sm-6 col-xs-6">' +
                    '<div custom-grid-date-filter-header></div></div></div>',
                    filters: [
                        {
                            name: 'From',
                            condition: uiGridConstants.filter.GREATER_THAN_OR_EQUAL
                        },
                        {
                            name: 'To',
                            condition: uiGridConstants.filter.LESS_THAN_OR_EQUAL
                        }
                    ],
                    cellFilter: 'date:"dd MMMM yyyy, h:mm:ss a"',
                    cellClass: getCellClass,
                    useExternalFiltering: false
                }
            ];

RegisterApi

 $scope.gridOptions.onRegisterApi = function (gridApi) {

                $scope.gridApi = gridApi;

                gridApi.selection.selectRow($scope.gridOptions.data[0]);

                gridApi.pagination.on.paginationChanged($scope, function (newPage, pageSize) {
                    paginationOptions.pageNbr = '&pageNbr=' + newPage ;
                    paginationOptions.pageSize = '&pageSize=' + pageSize;
                    getData();
                });

                gridApi.core.on.filterChanged( $scope, function() {

                    var grid = this.grid;

                    // Define behavior for cancel filtering
                    $scope.isfilterclear = true;

                    angular.forEach(grid.columns, function( col ) {
                        if(col.filters[0].term){
                            $scope.isfilterclear = false;
                        }
                    });
                    if($scope.isfilterclear) {
                        $timeout(function() {
                            $rootScope.refresh()
                        },500);
                    }

                    // Filter behavior
                    $scope.textFilter = grid.columns[1].filters[0].term;
                    if($scope.textFilter) {
                        $scope.$watch('textFilter', function (newVal, oldVal) {
                            filterOptions.filterParam = 'title==*' + newVal + "*";
                        }, true);
                        getData()
                    }

                    $scope.desFilter = grid.columns[2].filters[0].term;
                    if($scope.desFilter) {
                        $scope.$watch('desFilter', function (newVal, oldVal) {
                            filterOptions.filterParam = 'description==*' + newVal + "*";
                        }, true);
                        getData()
                    }

                    for (var et = 0; et < $scope.eventType.length; et ++){
                        var evtType = $scope.eventType[et].name;
                        var evtTypeId = $scope.eventType[et].id;
                        filterOptions.filterParam = 'eventTypeId==' + evtTypeId;

                        if( grid.columns[3].filters[0].term === evtType ) {
                            getData()
                        }
                    }

                    for (var stud = 0; stud < $scope.study.length; stud ++){
                        var study = $scope.study[stud].name;
                        var studyId = $scope.study[stud].id;
                        filterOptions.filterParam = 'studyId==' + studyId;

                        if( grid.columns[4].filters[0].term === study ) {
                           getData()
                        }
                    }

                    for (var pr = 0; pr < $scope.priority.length; pr ++){
                        var priority = $scope.priority[pr].name;
                        var priorityId = $scope.priority[pr].id;
                        filterOptions.filterParam = 'priorityId==' + priorityId;

                        if( grid.columns[5].filters[0].term === priority ) {
                            getData()
                        }
                    }

                    for (var sev = 0; sev < $scope.severity.length; sev ++){
                        var severity = $scope.severity[sev].name;
                        var severityId = $scope.severity[sev].id;
                        filterOptions.filterParam = 'severityId==' + severityId;

                        if( grid.columns[6].filters[0].term === severity ) {
                           getData()
                        }
                    }

                    for (var stat = 0; stat < $scope.status.length; stat ++){
                        var status = $scope.status[stat].name;
                        var statusId = $scope.status[stat].id;
                        filterOptions.filterParam = 'statusId==' + statusId;

                        if( grid.columns[7].filters[0].term === status ) {
                            getData()
                        }
                    }
                });

Where getData() is

var getData = function () {

                eventService.getEventsWithParams(
                    sortOptions.orderBy,
                    sortOptions.directions,
                    paginationOptions.pageSize,
                    paginationOptions.pageNbr,
                    filterOptions.filterBy,
                    filterOptions.filterParam
                )
                    .then(function (data) {

                        $scope.gridOptions.data = data;

                        // ***
                        angular.forEach($scope.gridOptions.data, function (val) {
                            val.occuredDate = new Date(val.occuredDate);
                        });

                        // $interval whilst we wait for the grid to digest the data we just gave it
                        $interval(function () {
                            $scope.gridApi.selection.selectRow($scope.gridOptions.data[0]);
                        }, 0, 1);

                    });
            };

my plunker (unfortunately I cannot provide the real API, but hope it will help anyhow)

解决方案

The working code is

  gridApi.core.on.filterChanged( $scope, function() {

                // Declare vars
                var grid = this.grid;
                var columns = grid.columns;
                $scope.columnTitle = grid.columns[1].filters[0].term;
                $scope.columnDesc = grid.columns[2].filters[0].term;
                var columnType = grid.columns[3].filters[0].term;
                var columnStudy = grid.columns[4].filters[0].term;
                var columnPriority = grid.columns[5].filters[0].term;
                var columnSeverity = grid.columns[6].filters[0].term;
                var columnStatus = grid.columns[7].filters[0].term;
                var columnCreatedDate = grid.columns[8].filters[0].term;
                var columnModifiedDate = grid.columns[9].filters[0].term;

                // Create request for selectable filters
                var query = [];
                var string;
                function request (id, param) {

                    if(param === "title==" || param === "description=="){
                        query.push(param + "*" + id + "*")
                    } else {
                        query.push(param + id);
                    }

                    if (query.length <= 1){
                        return query
                    } else {
                        string = query.join(";");
                        return string;
                    }
                }

                // Define behavior for cancel filtering
                $scope.isfilterclear = true;

                angular.forEach(columns, function( col ) {
                    if(col.filters[0].term){
                        $scope.isfilterclear = false;
                    }
                });
                if($scope.isfilterclear) {
                    $timeout(function() {
                        $rootScope.refresh()
                    },500);
                }

                // Filter behavior for columns
                if($scope.columnTitle) {
                    $scope.$watch('columnTitle', function (newVal, oldVal) {
                        filterOptions.filterParam =  request(newVal, 'title==*');
                    }, true);
                    getData()
                }
                if($scope.columnDesc) {
                    $scope.$watch('columnDesc', function (newVal, oldVal) {
                        filterOptions.filterParam =  request(newVal, 'description==');
                    }, true);
                    getData()
                }
                if(columnType) {
                    filterOptions.filterParam = request(columnType, 'eventTypeId==');
                    getData();
                }
                if(columnStudy) {
                    filterOptions.filterParam = request(columnStudy, 'studyId==');
                    getData();
                }
                if(columnPriority) {
                    filterOptions.filterParam = request(columnPriority, 'priorityId==');
                    getData();
                }
                if(columnSeverity) {
                    filterOptions.filterParam = request(columnSeverity, 'severityId==');
                    getData();
                }
                if(columnStatus) {
                    filterOptions.filterParam = request(columnStatus, 'statusId==');
                    getData();
                }
                if(columnCreatedDate){
                    filterOptions.filterParam = request($rootScope.setFilterDate, 'occuredDate>=');
                    getData()
                }
                if(columnModifiedDate){
                    filterOptions.filterParam = request($rootScope.setFilterDate, 'occuredDate>=');
                    getData()
                }
            });

As you can see, I declared custom function with two params where I'm providing my request param for each call, I'm not sure about elegancy of this way but for two week I didn't find better solution

这篇关于如何在角度 ui-grid 中捕获应用的列过滤器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
前端开发最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆