【问题标题】:ng table do not filter empty string in strict comparisonng 表在严格比较中不过滤空字符串
【发布时间】:2014-06-18 15:52:23
【问题描述】:

我正在使用 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) 不返回任何结果。

我发现,当您在列上 erase(比如说名称列)时,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()));
    }

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

【问题讨论】:

    标签: angularjs filter string ngtable


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

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

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

      根据ngTable API documentation

      修剪:布尔值

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多