我正在使用 Ng-Table 显示包含 3 列的项目列表:名称、机架、组。
我想对这些列应用“严格比较”,所以我所做的是:
self.tableParams = new ngTableParams({
page: 1,
// This count: 2 can be ignored as we change it in every request.
count: 50,
}, {
counts: [],
total: 100,
getData: function ($defer, params) {
var filteredData = params.filter() ? $filter('filter')(self.data, params.filter(), true) : self.data;
var orderedData = params.sorting() ? $filter('orderBy')(filteredData, params.orderBy()) : self.data;
$defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));
}
});
您可以假设它self.data
包含我的所有数据并var self = this;
在我的控制器中。
上述代码的问题在于,当您擦除其中一列中的过滤器字符串时,$filter('filter')(self.data, params.filter(), true)
不会返回任何结果。
我发现,当你在列上擦除时(比如说名称列),params.filter() 将包含一个像这样的对象: {'name': ""} 传递给$filter('filter')
并且过滤器试图只匹配空字符串!!
我试图通过添加以下代码来覆盖它:
getData: function ($defer, params) {
// When the user deletes the search text, this object keeps a variable with an empty string. The
// strict comparator will accept only empty strings. To overcome this problem we delete the property
for (var propt in params.filter()) {
if (params.filter()[propt] === '') {
delete params.filter()[propt];
}
}
var filteredData = params.filter() ? $filter('filter')(self.data, params.filter()) : self.data;
var orderedData = params.sorting() ? $filter('orderBy')(filteredData, params.orderBy()) : self.data;
$defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));
}
我的问题是这不是一个优雅的解决方案,并且此代码正在循环所有搜索列,以查看其中一个是否为空字符串。我可以更快地做某事吗?那能准确找到哪一列是空的并删除属性吗?更优雅、更不老套的东西?