如何在ngtable中使用选择筛选器?

20 浏览
0 Comments

如何在ngtable中使用选择筛选器?

我正在尝试在ngtable中使用select筛选器。我按照这个例子进行了操作,但是如果选择项中有空格(例如:Not Installed或Not Running),则无法工作(筛选)。我正在提供一个plunker以寻求帮助。\n我需要帮助的几件事:\n

    \n

  1. 选择项中的空格无法使用。
  2. \n

  3. 需要精确的筛选匹配。例如:选择Running只应该显示Running,而不是Not Running。
  4. \n

  5. 在ngtable示例中,当用户点击选择时,会多出一个空白条目,用户再次选择并点击选择筛选器后,它会被移除。
  6. \n

  7. 根据数据自动调整ngtable的宽度。
  8. \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\"enter

0
0 Comments

问题的原因是为了让filterAgentStatus函数运行,必须将 'select' 更改为 'select-multiple'。解决方法是在代码中将 'select-multiple' 的默认模板覆盖为单选的模板,并将item参数传递给filterAgentStatus函数。具体代码如下:


  

注意:在filterAgentStatus函数中,建议使用item参数而不是$column参数。

0
0 Comments

问题的原因是,使用ng-table时,无法直接通过filter="{ 'name': 'select' : true }"来实现下拉筛选功能。需要在控制该页面的.js文件中使用$filter('filter')来进行筛选。

解决方法是,创建一个自定义筛选器。可以参考ng-table官方提供的custom filter example for ng-table进行自定义筛选器的创建。

0
0 Comments

问题出现的原因是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即可。

0