Angularjs过滤器允许使用自定义比较器无效的空值?

时间:2014-12-15 13:24:49

标签: javascript angularjs

[修订]我找到了解决这个问题的方法,只需使用带有ver的AngularJs。 > = 1.3.6,应用过滤器并取消后,不会删除具有null属性的项!!

以下是原始问题

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

一旦我在文本框中键入一些文本并清除它,所有color属性为null的cat都会消失。

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

在ng-repeat中使用过滤器时,有没有办法允许空值?谢谢你inadvance !!

JS小提琴演示: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'}
];

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

$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;
  };

3 个答案:

答案 0 :(得分:1)

这里的问题是,在您清除输入后,过滤器模型如下所示:

{"Color": ""}

所以空字符串与颜色null的颜色不匹配。你需要做的就是删除" Color"属性如果它是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

答案 1 :(得分:0)

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

<强>标记:

<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/

答案 2 :(得分:-1)

if(expect ===&#39;&#39;)将检查空字符串,而不是null。

尝试用

替换它

if(!expected)     .....