【问题标题】:AngularJS filter comparator true while displaying ng-repeat list when input field is empty当输入字段为空时显示ng-repeat列表时AngularJS过滤比较器为真
【发布时间】:2014-02-07 14:26:19
【问题描述】:

我将从这个示例小提琴开始,它演示了使用比较器参数来过滤精确匹配......:

http://jsfiddle.net/api/post/library/pure/

priority 是 1-100 之间的数字,但我将其作为文本输入并过滤为字符串 所以任何包含子字符串的数据也将通过 ng-repeat ......就像当我输入 1 时,它也会显示 11、111、132 等......这就是我遇到 :true 比较器的方式。

我已经阅读了建议编写自定义过滤器函数的其他堆栈流答案,但是使用真正的比较器,看起来我可以通过以下方式实现我想要的:

<input type="text" class="form-control" id="search.priority"
  title='Priority number to filter by'
  ng-model="search.priority" >

<tr ng-repeat="workflowItem in workflows | filter:search:true">
  <td>{{workflowItem.priority}}</td>

它只过滤完全匹配的内容。但是,显然当输入字段为空时它不会传递任何内容,因为没有任何内容与空字符串匹配。

我的问题是:有没有一种方法可以让 ng-repeat 在字段为空时仍然显示所有内容,同时保持完全匹配过滤器?感谢大家的时间!

【问题讨论】:

  • 检查 jsfiddle 网址。
  • 我的理解是filter过滤器会在谓词为空字符串时返回所有元素。见jsfiddle.net/3aD8N
  • 抱歉 - 我现在看到了问题。

标签: javascript angularjs


【解决方案1】:

您需要使用自定义比较器函数。它将允许您执行严格的比较,除非谓词是虚假的。

您的标记将是:

 <input type="text" class="form-control" id="search.priority"
  title='Priority number to filter by'
  ng-model="search.priority" >

<tr ng-repeat="workflowItem in workflows | filter:search:exceptEmptyComparator">
 <td>{{workflowItem.priority}}</td>

并在您的控制器上定义比较器功能:

$scope.exceptEmptyComparator = function (actual, expected) {
    if (!expected) {
       return true;
    }
    return angular.equals(expected, actual);
}

这应该可以解决问题。

【讨论】:

  • 嘿乔尔 - 感谢您的帮助!我认为我正在走正确的道路,但有一件事 - 你能向我解释一下(实际的,预期的)参数是如何工作的吗?它指向什么?我应该将它们设置为函数内的实际值和预期值吗?
  • Angular 会为您解决这个问题——您只需在具有自定义比较器签名的范围内提供一个函数。对于数组中的每个元素,Angular 将调用比较器函数并按预期传递“搜索”,并将元素作为“实际”传递。所以我们说,如果预期或“搜索”为空,则匹配所有元素(返回 true)。否则,执行“严格”对象比较。请参阅:jsfiddle.net/hQ7CP
  • 所以预期和实际类似的关键字?它如何知道按预期传递“搜索”并将元素传递为“实际”?对不起,我是个菜鸟;(
  • 这些只是常规的函数参数。您正在为“过滤器”过滤器提供比较器功能。它将为数组中的每个元素调用您的函数,将元素作为第一个参数(“实际”)传递,将“搜索”作为第二个参数(“预期”)传递。在比较器上设置断点并单步执行以查看它的运行情况。希望对您有所帮助。
  • 引用 angularJS 的开发者指南:“注入的参数(exceptEmptyComparator 函数)是一个函数,它将值格式化为第一个参数(预期)并从第二个参数(实际)开始过滤参数。 "我在找什么是对的吗?非常感谢乔尔,我非常感谢您的帮助+解释我标记了您的答案。
猜你喜欢
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多