1

我正在使用 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()));
    }

我的问题是这不是一个优雅的解决方案,并且此代码正在循环所有搜索列,以查看其中一个是否为空字符串。我可以更快地做某事吗?那能准确找到哪一列是空的并删除属性吗?更优雅、更不老套的东西?

4

2 回答 2

1

我对您的解决方案进行了一些更正,因为在使用您的代码的情况下,在输入参数后过滤,擦除,输入不起作用。为了获得过滤数据,用户必须再次输入参数。这就是为什么我将 params.filter() 复制到另一个变量并对其进行处理的原因。

getData: function ($defer, params) {

  var customFilter = angular.copy(params.filter());

  for (var propt in customFilter) {
   if (customFilter[propt] === '') {
         delete customFilter[propt];
      }
   }
orderedData = customFilter ? $filter('filter')(orderedData, customFilter, true) : orderedData;
于 2016-10-07T07:30:05.737 回答
1

请注意,这个问题已经通过在 params.filter() 中包含 'trim' 参数得到解决:

getData: function(params) {
  var myData = /* ... */
  var filteredData = (params.filter(true) ? 
     $filter('filter')(myData, params.filter(true) : 
     myData);
  return filteredData;
}

根据ngTable API 文档

修剪:布尔值

[可选] 提供 true 以返回当前过滤器减去任何无关紧要的值(null、未定义和空字符串)

于 2017-04-10T16:56:38.757 回答