我正在使用AngularJS的ngGrid模块来显示一些分页的数据。我希望能够跨多个列搜索,但是使用OR搜索。
可以说我有一列带有以下标题:Id,Name,Description。当我搜索时,我想返回ID或名称或说明包含搜索词的所有行。
$scope.pagingOptions = { pageSizes: [20, 50, 100], pageSize: 20, totalServerItems: 0, currentPage: 1 }; $scope.gridOptions = { data: 'myData', columnDefs: [ { field: 'id', displayName: 'Id' }, { field: 'name', displayName: 'Name' }, { field: 'description', displayName: 'Description' }, { displayName: 'Actions', cellTemplate: '<input type="button" data-ng-click="doSomething(row.entity)" value="Do Something" />'}], enablePaging: true, showFooter: true, showFilter: true, pagingOptions: $scope.pagingOptions, filterOptions: { filterText: "", useExternalFilter: false } };
我尝试使用默认搜索框,还尝试使用绑定到$ scope.filterText的外部输入框来定义自定义过滤器,例如:
$scope.filterUpdated = function () { $scope.gridOptions.filterOptions.filterText = 'id:' + $scope.filterText + ';name:' + $scope.filterText + ';description:' + $scope.filterText; };
但是,这似乎在所有列上都执行了“与”运算。使用ngGrid模块可以实现我想要的吗?
提前致谢,
克里斯
是的,可以做一个OR过滤器,但是在ng- grid源代码中搜索后,我看不到如何使用它们进行操作filterOptions.filterText。那只能做AND过滤。
filterOptions.filterText
解决方案是然后使用 filterOptions.useExternalFilter:true
filterOptions.useExternalFilter:true
我也没有找到它的示例,但是经过一番尝试之后,我发现过滤器实际上是通过重新创建gridOptions.data对象来完成的。 这是此筛选器的唯一缺点 。
gridOptions.data
柱塞代码在这里
因此,基本上,您的代码将类似于以下 index.html :
<body ng-controller="MyCtrl"> <strong>Filter Name:</strong> </string><input type="text" ng-model="filterName"/> </br> OR </br> <strong>Filter Age:</strong> </string><input type="text" ng-model="filterAge"/> </br> <button ng-click="activateFilter()">Run Filter</button> <br/> <br/> <div class="gridStyle" ng-grid="gridOptions"></div> </body>
在你的 controller.js中 :
app.controller('MyCtrl', function($scope) { $scope.filterOptions = { filterText: '', useExternalFilter: true }; $scope.activateFilter = function() { var name = $scope.filterName || null; var age = ($scope.filterAge) ? $scope.filterAge.toString() : null; if (!name && !age) name=''; $scope.myData = angular.copy($scope.originalDataSet, []); $scope.myData = $scope.myData.filter( function(item) { return (item.name.indexOf(name)>-1 || item.age.toString().indexOf(age) > -1); }); }; $scope.originalDataSet = [{name: "Moroni", age: 50}, {name: "Tiancum", age: 43}, {name: "Jacob", age: 27}, {name: "Nephi", age: 29}, {name: "Enos", age: 34}]; $scope.myData = angular.copy($scope.originalDataSet, []); $scope.gridOptions = { data: 'myData', filterOptions: $scope.filterOptions }; });
那只是基本过滤(使用正则表达式和/或转换为小写字母以实现更好的匹配)。还要注意,如果name和age均为空,则将name设置为”,然后每个元素在过滤器内都将返回true(导致整个数据集返回)。
此选项更适合于 动态 数据集(由 服务器读取 ),但它的工作原理很好,但可以复制原始数据集并对其应用过滤器。