在ng-repeat语句中按子数组过滤对象,该语句使用$ index跟踪来处理欺骗

时间:2016-10-03 18:58:22

标签: javascript angularjs

我有一个对象narrow.searchedMenu,其中包含3个等长子数组,我使用ng-repeattrack by $index显示,因为有一些重复的元素。

    <ul>
      <li ng-repeat="item in narrow.searchedMenu.description track by $index">
         {{ narrow.searchedMenu.name[$index] }},
         {{ narrow.searchedMenu.short_name[$index] }},
         {{ narrow.searchedMenu.description[$index] }}</li>
  </ul>

我需要能够通过仅保留description中关键字出现的结果来过滤显示的结果。如果description不匹配,我想要排除nameshort_name以及description

通常我会使用这样的东西:

| filter{description:'chicken'} 

附加到ng-repeat语句的末尾。但是,它似乎不适用于track by

我在尝试时在控制台上给出了这个错误:

  

错误:[$ parse:syntax]   http://errors.angularjs.org/1.5.8/ $解析/语法P0 =%7B&安培; P1 =是%20AN%20unexpected%20token&安培; P2 = 16&安培; P3 = NaNndex%20%7C%滤波器%7Bdescription%3A'chicken'%7D&安培; P4 = %7Bdescription%3A'chicken'%7D

我已经尝试了其他几种可能的解决方案,但到目前为止还没有运气。

请注意,$scope未注入我的控制器,如果我尝试使用自定义过滤器,则会收到以下错误:

  

“错误:[filter:notarray]   errors.angularjs.org/1.5.8/filter/notarray?p0=0" ;

最后一件事 - 我被告知要避免使用includes,因为它没有得到足够广泛的支持(有人说polyfill是替代品,但我不确定它是否适用对此?)。

2 个答案:

答案 0 :(得分:1)

您可以使用附加到控制器中对象的自定义过滤器,只要您将public struct MultivalueEntry<T> { public var value : T public var label : String? public let id : Int public init(value: T, label: String?, id: Int) { self.value = value self.label = label self.id = id } } 作为track by中的最后一个语句

控制器中的过滤器如下所示:

ng-repeat

menu.chickenFilter = function(item) { return (item.indexOf('chicken') > -1) } 将成为:

ng-repeat

答案 1 :(得分:0)

使用此

 <ul>
  <li ng-repeat="item in narrow.searchedMenu track by $index" ng-if="narrow.searchedMenu[$index].description.indexOf('chicken')>-1">
     {{ narrow.searchedMenu.name[$index] }},
     {{ narrow.searchedMenu.short_name[$index] }},
     {{ narrow.searchedMenu.description[$index] }}</li>
</ul>

我在这里创建了一个plunker

http://plnkr.co/edit/KXvD4JgwRe9wNszt8rCy?p=preview