【问题标题】:Angularjs filter allow null value using custom comparator not working?Angularjs过滤器允许使用自定义比较器的空值不起作用?
【发布时间】:2014-12-15 13:24:49
【问题描述】:

[Revised] 我找到了一个解决方案,只需将 AngularJs 与 ver 一起使用。 >= 1.3.6,具有空属性的项目在应用过滤器并取消它后不会被丢弃!!

以下是原始问题

大家好。我使用 AngularJs 在带有 ng-repeat 指令的表格中显示数据,并使用文本框来过滤猫的“颜色”属性。请注意,有些猫的 Color 属性为空。

一旦我在文本框中输入一些文本并清除它,所有颜色属性为空的猫都消失了。

我在expected === '' 上设置了一个返回 true 的自定义比较器,但它不起作用。实际上,一旦搜索文本框被放入一些文本并随后被清除,所有颜色为property === null 的猫将永远不会显示,即使我让比较器始终返回 true。

在 ng-repeat 中使用过滤器时,有什么方法可以允许空值?谢谢你的提前!!

JS Fiddle 演示:http://jsfiddle.net/gLL7wvcL/2/

我的数据(猫数组)

$scope.cats = [
{'Name': 'John',
 'Sex': 'Male',
 'Color': 'Black'},
{'Name': 'Rose',
 'Sex': 'Female',
 'Color': 'White'},
  {'Name': 'Cindy',
 'Sex': 'Female',
 'Color': 'Yellow'},
  {'Name': 'David',
 'Sex': 'Male',
 'Color': 'Black'},
  {'Name': 'Garen',
 'Sex': 'Male',
 'Color': null},
  {'Name': 'Jim',
 'Sex': 'Male',
 'Color': null},
  {'Name': 'Charotte',
 'Sex': 'Female',
 'Color': 'Black'}
];

并且两个比较器都不起作用,一旦搜索文本框被放入一些文本并随后被清除,所有具有颜色属性 === null 的猫将永远不会显示。

$scope.myComparator = function (actual, expected) 
  {
      if (expected === '') 
          return true;
      else
      {
          var text = ('' + actual).toLowerCase();
            return text.indexOf(expected) > -1;
      }
  };

$scope.myComparator = function (actual, expected) 
  {
      return true;
  };

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    这里的问题是,在你清除输入后,过滤器模型是这样的:

    {"Color": ""}
    

    所以空字符串不会匹配颜色与颜色null。如果它是null,您只需要删除“颜色”属性,可能正在更改。在这种情况下,您根本不需要myComparator

    $scope.clear = function() {
        if ($scope.search.Color === null) {
            delete $scope.search.Color;
        }
    };
    

    你只会使用

    ng-repeat="cat in cats | filter:search"
    

    演示:http://plnkr.co/edit/MrvBa09y9SrE3TlTUxP6?p=preview

    【讨论】:

    • 谢谢!有用!但我认为这种方式是一种解决方法?如果我想过滤多个属性,我必须在 clear() 函数中编写更多删除语句,对吗?我真的很好奇为什么比较器总是返回 true 仍然会阻止具有 null 属性的项目
    • “我真的很好奇为什么比较器总是返回 true 仍然会阻止具有 null 属性的项目” 甚至没有为 null 值调用比较器,因为它是在 filter 函数之后执行的(之前步)。并且过滤器表达式不包括Color: null 对象。
    • “如果我想过滤多个属性,我必须在 clear() 函数中编写更多的删除语句,对吗?” 你可以编写通用函数,就像这样演示plnkr.co/edit/PEGJMdenU9CtfOd1vaID?p=preview
    • 没问题。如果您需要,请随时接受答案。
    【解决方案2】:

    另一种方法是使用过滤器函数,与整个对象而不是属性进行比较,并将条件附加到控制器范围。

    标记:

    <tr ng-repeat="cat in cats | filter:myComparator">
    

    控制器:

    $scope.myComparator = function (actual) 
    {
        var expected = $scope.filter;
        if (expected === '') 
        {
            return true;
        }
        else
        {
            var text = ('' + actual.Color).toLowerCase();
            return text.indexOf(expected) > -1;
        }
    };
    

    更新的小提琴中的完整示例:http://jsfiddle.net/gLL7wvcL/3/

    【讨论】:

    • 谢谢,它有效!但有了这个解决方案,我必须硬编码var expected = $scope.filter; 以获得我的预期值。
    【解决方案3】:

    if (expected === '') 将检查空字符串,而不是 null。

    尝试用

    替换它

    如果(!预期) .....

    【讨论】:

    • 预期是要搜索的输入字符串,当没有搜索值时,它确实是 ''。
    • 感谢您的回答!!但我认为“预期”是指我的搜索文本框中的内容,而不是我被过滤的数据的实际值。我尝试了您的解决方案,但遗憾的是它也不起作用。
    猜你喜欢
    • 2017-08-16
    • 2017-07-25
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    相关资源
    最近更新 更多