如何在ngtable中使用选择筛选器?
如何在ngtable中使用选择筛选器?
我正在尝试在ngtable中使用select筛选器。我按照这个例子进行了操作,但是如果选择项中有空格(例如:Not Installed或Not Running),则无法工作(筛选)。我正在提供一个plunker以寻求帮助。\n我需要帮助的几件事:\n
- \n
选择项中的空格无法使用。- 需要精确的筛选匹配。例如:选择Running只应该显示Running,而不是Not Running。
- 在ngtable示例中,当用户点击选择时,会多出一个空白条目,用户再次选择并点击选择筛选器后,它会被移除。
- 根据数据自动调整ngtable的宽度。
\n
\n
\n
\n
\n更新代码\n
var app = angular.module('main', ['ngTable']) .controller('DemoCtrl', function($scope, $filter, ngTableParams, $log) { $scope.tableData = [{"host":"UST490","org":"00ABHI","status":"images/icon/not_installed.png","selectId":"notInstalled","name":"Not Installed"},{"host":"UST4205","org":"00ABHI","status":"images/icon/not_installed.png","selectId":"notInstalled","name":"Not Installed"},{"host":"UST4089","org":"00ABHI","status":"images/icon/not_installed.png","selectId":"notInstalled","name":"Not Installed"},{"host":"UST4492","org":"00ABHI","status":"images/icon/not_installed.png","selectId":"notInstalled","name":"Not Installed"},{"host":"Bhan-1","org":"00ABHI","status":"images/icon/not_installed.png","selectId":"notInstalled","name":"Not Installed"},{"host":"UST1102","org":"00ABHI","status":"images/icon/x_mark-red.png","selectId":"notRunning","name":"Not Running"},{"host":"UST5202","org":"00ABHI","status":"images/icon/tick.png","selectId":"running","name":"Running"}]; $scope.tableParams = new ngTableParams({ page: 1, // 显示第一页 count: 10 // 每页显示数量 }, { total: $scope.tableData.length, // 数据长度 getData: function($defer, params) { var filterData = params.filter() ? $filter('filter')($scope.tableData, params.filter()) : $scope.tableData; var orderedData = params.sorting() ? $filter('orderBy')(filterData, params.orderBy()) : filterData; var table_data = orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()); params.total(orderedData.length); $defer.resolve(table_data); } }); //参考自http://ng-table.com/#/demo/3-2 /*var inArray = Array.prototype.indexOf ? function(val, arr) { var temp = arr.indexOf(val); return temp; } : function(val, arr) { var i = arr.length; while (i--) { if (arr[i] === val) return i; } return -1 };*/ $scope.filterAgentStatus = function(column) { var def = $q.defer(), arr = [], filterAgentStatus = []; angular.forEach($scope.tableData, function(item) { //if (inArray(item.name, arr) === -1) { //arr.push(item.name); if (jQuery.inArray(item.selectId, arr) === -1) { arr.push(item.selectId); filterAgentStatus.push({ 'id': item.selectId, 'title': item.name }); } }); def.resolve(filterAgentStatus); return def; }; });
\n
{{ item.host }} | {{item.org}} |
\n以下是屏幕截图:\n
问题的原因是,使用ng-table时,无法直接通过filter="{ 'name': 'select' : true }"来实现下拉筛选功能。需要在控制该页面的.js文件中使用$filter('filter')来进行筛选。
解决方法是,创建一个自定义筛选器。可以参考ng-table官方提供的custom filter example for ng-table进行自定义筛选器的创建。
问题出现的原因是ng-table
只负责收集用户的过滤器值,而不会实际应用过滤器到数据上。解决方法是使用除了$filter之外的其他方法来实现精确匹配行为。
问题的解决方法是通过编辑之前的答案来修复ng-table
的问题。具体的修复过程可以在这个链接中找到:https://github.com/esvit/ng-table/pull/654#issuecomment-127095189。修复的提交记录在这里:1ee441。
另外一条问题是关于ng-table
的自动宽度。渲染的HTML表格的列宽度是由CSS控制的,ng-table
并没有添加任何特定的宽度控制。你应该创建自己的样式规则来改变宽度。另外,你也可以在HTML标记中使用colgroup
,并为每个<col>
标签分配特定的宽度。
其实,$filter的'filter'过滤器的第三个参数可以使用angular.equals()
进行比较,这样就可以得到你想要的精确匹配。只需要将第三个参数设置为true
即可。